[PHP/MySQL] sql dans une fonction php

salut

peut on inclure des donner sql dans une fonction php

j’ai fait ça mais enfaite rien ne fonctionne



function rate($name)
{
	include_once 'config.php';
	
$vote = mysql_query("SELECT * FROM vote WHERE id_ref = ".$name."") or die(mysql_error());
$row_vote = mysql_fetch_assoc($vote);


	if ($row_vote['ip_ref'] == $name ) {



j’ai fait un echo $row_vote[‘ip_ref’] et il retourne rien donc j’en conclu qu’un truc ne marche pas et je voie pas pk.

En général, les includes_once ne se font pas dans les fonctions, sinon les variables globales deviennent des variables locales.

Quant à savoir ce qui ne marche pas, essaye ta requête dans phpmyadmin?

le include je l’ai rajouté pour etre sur que ma requete sql marche et pas me retrouver avec un probleme lier a la connexion sql, j’évite juste ce probleme avec ça.
Mais malgré ça, j’ai rien…

ma requéte sql fonctionne dans phpmyadmin

<?
function rate($name)
{
	include_once 'config.php';
	
$vote = mysql_query("SELECT * FROM vote WHERE id_ref = ".$name."") or die(mysql_error());
$row_vote = mysql_fetch_assoc($vote);


	if ($row_vote['ip_ref'] == $name ) { // ce qu'il est sencé retourné actuellement il fait rien == 2012 au lieu de 2012==2012

  // Calculs :

  if (($row_vote['tt_votes'] == 0) AND ($row_vote['nb_votes'] == 0))
  {
  	// Si fichier vide
  	$etoiles_oui = 0;
  	$note = "0.00";
  }
  else
  {
  	$moy_en = $row_vote['tt_votes']/$row_vote['nb_votes'];
  	$etoiles = round($moy_en);
  	$note = round($moy_en, 2);
  }

  $Result = "<div class=\"box_stats\">";


  if ($row_vote['nb_votes'] > 0)
  {
  	$Result .="<h1>Votre avis :<br><img src=\"img/warn".$etoiles.".gif\" border=\"0\" alt=\"Rate\"></h1>";
  	$Result .="<h1>Note :<br>".$note."  /  5</h1>";
  	$Result.="<h1>Votants :<br>".$nb_votes."</h1>";
	


  }
  else $Result .="<span class='vote'>Aucun vote encore</span>";

  if (!isset($_COOKIE[$name])) 
  {

  	$Result.="              <form name=\"rate\" action=\"inc/takerate.php?name=$name\" method=\"post\"   onSubmit=\"alert('Merci de votre vote!');\" >";
  	$Result.="                <table align=\"center\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\">";
  	$Result.="                  <tbody>";
  	$Result.="                    <tr>";
  	$Result.="                      <td align=\"center\">1<br>";
  	$Result.="                          <input value=\"1\" name=\"note\" type=\"radio\"></td>";
  	$Result.="                      <td align=\"center\">2<br>";
  	$Result.="                          <input value=\"2\" name=\"note\" type=\"radio\"></td>";
  	$Result.="                      <td align=\"center\">3<br>";
  	$Result.="                          <input value=\"3\" name=\"note\" type=\"radio\"></td>";
  	$Result.="                      <td align=\"center\">4<br>";
  	$Result.="                          <input value=\"4\" name=\"note\" type=\"radio\"></td>";
  	$Result.="                      <td align=\"center\">5<br>";
  	$Result.="                          <input value=\"5\" name=\"note\" type=\"radio\"></td>";
  	$Result.="                    </tr>";
  	$Result.="                    <tr>";
  	$Result.="                      <td colspan=\"5\" align=\"center\"><input type=\"submit\" style=\"font-size: 9px;\" value=\"Noter\"></td>";
  	$Result.="                    </tr>";
  	$Result.="                  </tbody>";
  	$Result.="                </table>";
  	$Result.="              </form>";

  }
  else $Result.="";

  $Result.="</div>";

	}
	else // ce qu'il retourne actuellement alors qu'il ne devrait pas
	{

  
  $Result ="            <div class=\"box_stats\">";
  $Result.="<span class='vote'>Pas de vote".$row_vote['ip_ref']."</span>";
        $Result.="              <form name=\"rate\" action=\"inc/takerate.php?name=$name\" method=\"post\"   onSubmit=\"alert('Merci de votre vote!');\" >";
        $Result.="                <table align=\"center\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\">";
        $Result.="                  <tbody>";
        $Result.="                    <tr>";
        $Result.="                      <td align=\"center\">1<br>";
        $Result.="                          <input value=\"1\" name=\"note\" type=\"radio\"></td>";
        $Result.="                      <td align=\"center\">2<br>";
        $Result.="                          <input value=\"2\" name=\"note\" type=\"radio\"></td>";
        $Result.="                      <td align=\"center\">3<br>";
        $Result.="                          <input value=\"3\" name=\"note\" type=\"radio\"></td>";
        $Result.="                      <td align=\"center\">4<br>";
        $Result.="                          <input value=\"4\" name=\"note\" type=\"radio\"></td>";
        $Result.="                      <td align=\"center\">5<br>";
        $Result.="                          <input value=\"5\" name=\"note\" type=\"radio\"></td>";
        $Result.="                    </tr>";
        $Result.="                    <tr>";
        $Result.="                      <td colspan=\"5\" align=\"center\"><input type=\"submit\" style=\"font-size: 9px;\" value=\"Noter\"></td>";
        $Result.="                    </tr>";
        $Result.="                  </tbody>";
        $Result.="                </table>";
        $Result.="              </form>";
        $Result.="            </div>";
  
  
  
  
	}

	return $Result;
}

voila tout le code

Je ne comprend pas.

Pourquoi dés que les gens ont un problèmes ils essayent pas de réfléchir deux secondes? © avis perso

Tu dis que ta requête pose problème, hé bien affiche là, éxecute là dans phpmyadmin voir ce qu’elle fait, si elle correspond à tes besoins…

Comme dit Sans Nom

Moi je veux bien te corriger synthaxiquement ta requête, le problème vient peut etre de la, il y a une synthaxe vraiment pas terrible :

$vote = mysql_query("SELECT * FROM vote WHERE id_ref = ".$name."") or die(mysql_error());

devient

$vote = mysql_query("SELECT * FROM `vote` WHERE `id_ref`='".$name."'") or die(mysql_error());

ou

$vote = mysql_query("SELECT * FROM `vote` WHERE `id_ref`='$name'") or die(mysql_error());

Non.

Vire ces merdes de `qui sont pas ANSI SQL. C’est une invention de mySQL pour palier à l’utilisation de " comme délimiteur de chaîne, alors que cela ne devrait pas être le cas :slight_smile:

Puis si je lui ai rien dis sur la requête, c’est qu’elle est à priori juste ('fin $name n’est pas protégée convenablement, mais ça…)

Je ne savais pas c’est interessant. Mais en les omettant dans certain cas même très simple, ma requete ne passait pas cependant. (php5/mysql5). En disant ne passant pas, j’avais le droit a une erreur de synthaxe raportée par phpmyadmin, c’est pour ca que j’ai pris l’habitude de les mettre. Je reesaierai de trouver ces cas alors.

Tu mets quoi à la place alors ?

Rien à priori je pense.

Thierry on veut bien t’aider mais faudrait que tu sois un peu là :slight_smile:

C’est bien beau de créer une fonction mais l’as tu appelé correctement ?

echo rate(‘lol’);

Sinon, y a-til des erreurs retournées ? Si oui donnes les nous.

la fonction fonctionne :smiley: elle marchait avant mais pas avec sql mais un fichier txt je suis entrein de changer ça car je prefére sql pour faire des stats etc…

Ma requete SQL marche dans phpmyadmin, elle ne pose donc pas de probleme

la variable $name marche aussi puisque si je fais un echo c’est correcte
par contre un echo $row_vote[‘ip_ref’] ne donne rien.

aucune erreur retourné non plus

Regarde totu ce que contient ton tableau après la requete et poste ici le resultat :slight_smile:

$vote = mysql_query("SELECT * FROM vote WHERE id_ref = '".$name."'") or die(mysql_error());
$row_vote = mysql_fetch_assoc($vote);

echo '<pre>';
print_r($row_vote);
echo '</pre>';

Array
(
[idx] => 10
[ip_ref] => 2012
[tt_votes] => 22
[nb_votes] => 6
[var] =>
)

humm donc le probleme s’emble juste apres…

Bizarre …
A toiut hasard, essaye quelques synthaxe alternatives :

Que donne ces echo (pareil poste ici)

$vote = mysql_query("SELECT * FROM vote WHERE id_ref = '".$name."'") or die(mysql_error());
$row_vote = mysql_fetch_assoc($vote);

echo '<pre>';
print_r($row_vote);

echo '0. -------------'
echo $row_vote['ip_ref'];
echo '1. -------------'
echo $row_vote[ip_ref];
echo '2. -------------'
echo $row_vote["ip_ref"];
echo '3. -------------'
echo $row_vote[1];
echo '</pre>';

En ANSI SQL, c’est " qui sert de délimiteur de nom de champ :

SQL
SET sql_mode = ANSI

[color=blue;font-weight:bold]SELECT[/color] 1 AS “ah ah”, ‘chaîne’ || ‘concat’ AS “foo” FROM DUAL

Je penses que tu préférerais ça Sans-Nom

$query_vote = sprintf(“SELECT * FROM vote WHERE id_ref = ‘%s’”, $name);
$row_vote = mysql_query($query_vote) or die(mysql_error());

Ca ne protége pas du tout la requête SQL contre les injections, mais c’est presque ça, oui.

et qu’elle est la solution pour protéger la requete contre les injections?