[SQL] Problème INSERT clause WHERE

Résolu/Fermé
Durst1805 - 15 août 2008 à 02:37
 Durst1805 - 19 août 2008 à 18:32
Bonjour, je rencontre un problème bénin, de syntaxe surement, mais je n'arrive pas à trouver d'exemple concrets sur le net.
Voilà j'ai une fonction casesriviere() qui est sensée ajouter du code HTML dans la colonne image de ma table casesmap.
La colonne où le code doit être ajouté, est définie par un chiffre aléatoire grâce à un rand. J'aimerais donc utiliser le résultat de $rand pour définir la colonne où va s'ajouter le code HTML, grâce à une condition dans la clause WHERE de ma requête INSERT.

Voici le code de ma fonction :

function casesRiviere()
{			
		
	//paramètre de connexion à la base de données
	$hote = 'localhost';
	$utilisateur = 'administrateur';
	$mdp = 'motdepasse';
	$connexion = mysql_connect ($hote, $utilisateur, $mdp);
	$bdd = 'ile';
		
	//connexion à la base de donnée
	mysql_select_db($bdd, $connexion);
		
	while ($i==1)
		{
			$rand = rand(0,143);
			
			if($rand == 0|1|2|3|4|5|6|7|8|9|10|11|132|133|134|135|136|137|138|139|140|141|142|143)
				{
					$riveH = "INSERT INTO casesmap (`image`) VALUES ('<img src=\"../images/riveH.png\" alt=\"\" />') WHERE ID = '".$rand."'";
					$query3 = mysql_query($riveH, $connexion);
					$i=0;
				}
			elseif($rand == 12|24|36|48|60|72|84|96|108|120|23|35|47|59|71|83|95|107|119|131)
				{
					$riveD = "INSERT INTO casesmap (`image`) VALUES ('<img src=\"../images/riveD.png\" alt=\"\" />') WHERE ID = '".$rand."'";
					$query4 = mysql_query($riveD, $connexion);
					$i=0;
				}
			else { $rand = rand(0,143); }
				
		}				
}


Je pense donc que c'est au niveau de la condition de WHERE que ça coince, car je n'ai pas d'erreur PHP en retour. Quand je vérifie ma base de donnée, aucune entrée ne contient le code HTML dans la colonne image.

Merci d'avance, je pense pas que ce soit un gros problème, mais je ne suis que novice en SQL donc difficile pour moi de savoir si ma requête est correctement formulée.

19 réponses

kryoportail Messages postés 222 Date d'inscription dimanche 10 août 2008 Statut Membre Dernière intervention 22 mai 2014 125
15 août 2008 à 06:38
Salut,

Oui la syntaxe du 'elseif' c'est bon.

La requête SQL semble OK.
Note : tu aurais pu faire l'usage de la fonction : 'mysql_real_escape_string( )' pour échapper le code HTML de l'image...

Par contre ton test :
if($rand == 12|24|36|48|60|72|84|96|108|120|23|35|47|59|71|83|95|107|119­|131) 

Ça me fait bizarre !...

En lisant ça, l'interpréteur PHP pour moi, calcul le 'OU' binaire de 12 OU 24 OU 36... 119 OU 131 est vérifie que la valeur obtenue est égale à $rand. Bref, pour moi, il passe directement à la clause 'else'.

Si je crois comprendre ce que tu veux faire, ce serait plutôt :
if( $rand == 12 || $rand == 24 || ...... || $rand == 119­|| $rand == 131)


Si c'est le cas, au niveau propreté tu devrais peut-être plutôt faire :

$a1 = explode( '|', '0|1|2|3|4|5|6|7|8|9|10|11|132|133|134|135|136|137|138|139|14­0|141|142|143' );
$a2 = explode( '|', '12|24|36|48|60|72|84|96|108|120|23|35|47|59|71|83|95|107|119|131' );
.....
if( in_array( $rand, $a1 ) )
{
   ....
}
   elseif( in_array( $rand, $a2 ) )
{
   ....
}
else
{
   $rand = rand(0,143);
}



Amicalement,
S@M...
http://kryoportail.ath.cx
1
kryoportail Messages postés 222 Date d'inscription dimanche 10 août 2008 Statut Membre Dernière intervention 22 mai 2014 125
15 août 2008 à 16:13
Re,

Même si ta table en base de données semble simple, peux-tu exporter la table 'casesmap' que je puisse essayer ?
(Onglet 'Exporter' sous phpmyadmin ).

----------------------

string mysql_real_escape_string ( string $unescaped_string [, resource $link_identifier ] );
Protège les caractères spéciaux de la chaîne
Voir: https://www.php.net/mysql_real_escape_string

Et on s'en sert comme ceci :
$HtmlImg = mysql_real_escape_string ( '<img src="../images/riveD.png" alt="" />', $connexion );
$MyQuery = "INSERT INTO `casesmap` ( `image` ) VALUES ( '{$HtmlImg}' )"


Le mieux c'est de passer systématiquement par cette fonction pour convertir toute variable introduite dans une requête MySQL. Cela permet d'éviter les 'injections SQL', en particulier lorsque les variables proviennent de l'utilisateur...
Voir: https://fr.wikipedia.org/wiki/Injection_SQL

----------------------

Amicalement,
S@M...
http://kryoportail.ath.cx
1
Ha oui j'oubliais d'ajouter que ma table possède deux colonne, ID (clé primaire) et image
0
ReDLine Messages postés 30 Date d'inscription mercredi 13 août 2008 Statut Membre Dernière intervention 18 août 2008 7
15 août 2008 à 03:02
Bonsoir,
Est-ce normal que else if soit attaché ?
Essaye ça pour voir... =$

else if($rand == 12|24|36|48|60|72|84|96|108|120|23|35|47|59|71|83|95|107|119|131)
{
$riveD = "INSERT INTO casesmap (`image`) VALUES ('<img src=\"../images/riveD.png\" alt=\"\" />') WHERE ID = '".$rand."'";
$query4 = mysql_query($riveD, $connexion);
$i=0;
}
else { $rand = rand(0,143); }

}
}
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Non ça ne change rien, et il me semble bien que la syntaxe de elseif est correcte, je crois que c'est une sorte de raccourci.
0
Ok merci, je ne connaissais pas du tout cette syntaxe que tu me propose. J'essaie de la mettre en œuvre dans la journée et je te tiens au courant.
Merci.
0
Peux-tu me parler de la fonction 'mysql_real_escape_string( )' ? comment l'utilise-t-on ?
0
Apparement je n'ai pas su utiliser au mieux tes conseils.
Avec ce code ci-dessous, rien n'a changé : toujours pas d'erreur SQL ou PHP, mais aucun résultat visible dans la BDD.

function casesRiviere()
{			
		
	//paramètre de connexion à la base de données
	$hote = 'localhost';
	$utilisateur = 'root';
	$mdp = '';
	$connexion = mysql_connect ($hote, $utilisateur, $mdp);
	$bdd = 'ile';
		
	//connexion à la base de donnée
	mysql_select_db($bdd, $connexion);
									
	while ($i==1)
		{
			$rand = rand(0,143);
				
			$a1 = explode( '|', '0|1|2|3|4|5|6|7|8|9|10|11|132|133|134|135|136|137|138|139|140|141|142|143' );
			$a2 = explode( '|', '12|24|36|48|60|72|84|96|108|120|23|35|47|59|71|83|95|107|119|131' );

			if(in_array( $rand, $a1 ))
				{
					$riveH = "INSERT INTO casesmap (`image`) VALUES ('<img src=\"../images/riveH.png\" alt=\"\" />') WHERE ID = '".$rand."'";
					$query3 = mysql_query($riveH, $connexion);
					$i=0;
				}
			else if(in_array( $rand, $a2 ))
				{
					$riveD = "INSERT INTO casesmap (`image`) VALUES ('<img src=\"../images/riveD.png\" alt=\"\" />') WHERE ID = '".$rand."'";
					$query4 = mysql_query($riveD, $connexion);
					$i=0;
				}
			else { $rand = rand(0,143); }
				
		}				
}


Peut-être que je n'ai pas correctement formulé tout ça. Je suppose que 'explode' permet de construire un tableau ? par contre je ne sais pas pourquoi il y un '|' au début et | | | entre les nombres. Ensuite la condition des if (in_array( $rand, $a1 )) qu'est-ce que ça fait au juste ? ça compare si $rand existe bien dans $a1 ?
0
Bon après avoir insérer comme condition à mes if ( $rand == 1 || $rand == 2 || rand == 3 || .... ) celà ne fonctionne toujours pas. Bizarre, je m'explique : au début je pensais que c'était peut-être parce que, à chaque rebouclage, le dernier else qui demande à $rand de créer un nouveau chiffre pour qu'il puisse tomber juste à un moment (else $rand (0, 143);) , ne fonctionnait pas. Mais en y réfléchissant, la boucle ne bouclerait jamais si elle ne tombait pas juste à un moment, car la condition de bouclage ne se résolve qu'a l'intérieur d'un des deux if ($i = 0).

Peut-être donc qu'il y a une erreur dans l'insertion du code HTML dans la table casesmap.
Je pensais aussi que ma fonction n'étais peut-être pas appelée correctement, c'est pourquoi je poste le code complet de mon petit programme :


<?php

function ajoutCases()
{
	for ($i=0, $num=0; $i<144; $i++,$num++) 
		{		
		
			//création des cases initiales
			$zone='<div class="case" id="case'.$num.'">';
			$img='<img src="../images/case.png" alt="" />';
			$fin='</div>';
			echo $zone.$img.$fin;	
			
			//paramètre de connexion à la base de données
			$hote = 'localhost';
			$utilisateur = 'root';
			$mdp = '';
			$connexion = mysql_connect ($hote, $utilisateur, $mdp);
			$bdd = 'ile';	
			
			//connexion à la base de donnée
			mysql_select_db($bdd, $connexion);
			
			//ajout des ID des cases dans la table casesmap
			$idcases = "INSERT INTO casesmap (`ID`) VALUES ('$num')";
			$query = mysql_query($idcases, $connexion);

		}
}
		
function casesRiviere()
{			
		
	//paramètre de connexion à la base de données
	$hote = 'localhost';
	$utilisateur = 'root';
	$mdp = '';
	$connexion = mysql_connect ($hote, $utilisateur, $mdp);
	$bdd = 'ile';
		
	//connexion à la base de donnée
	mysql_select_db($bdd, $connexion);
	
	while ($i==1)
		{
			$rand = rand(0,143);
			
			if($rand == 0 || $rand == 1 || $rand == 2 || $rand == 3 || $rand == 4 || $rand == 5 || $rand == 6 || $rand == 7 || $rand == 8 || $rand == 9 || $rand == 10 || $rand == 11 || $rand == 132 || $rand == 133 || $rand == 134 || $rand == 135 || $rand == 136 || $rand == 137 || $rand == 138 || $rand == 139 || $rand == 140 || $rand == 141 || $rand == 142 || $rand == 143)
				{
					$riveH = "INSERT INTO casesmap (`image`) VALUES ('<img src=\"../images/riveH.png\" alt=\"\" />') WHERE ID = '".$rand."'";
					$query3 = mysql_query($riveH, $connexion);
					$i=0;
				}
			elseif($rand == 12 || $rand == 24 || $rand == 36 || $rand == 48 || $rand == 60 || $rand == 72 || $rand == 84 || $rand == 96 || $rand == 108 || $rand == 120 || $rand == 23 || $rand == 35 || $rand == 47 || $rand == 59 || $rand == 71 || $rand == 83 || $rand == 95 || $rand == 107 || $rand == 119 || $rand == 131)
				{
					$riveD = "INSERT INTO casesmap (`image`) VALUES ('<img src=\"../images/riveD.png\" alt=\"\" />') WHERE ID = '".$rand."'";
					$query4 = mysql_query($riveD, $connexion);
					$i=0;
				}
			else { $rand = rand(0,143); }
				
		}				
}

casesRiviere();
ajoutCases();

?>


Voilà.
0
balou01 Messages postés 83 Date d'inscription mardi 26 juin 2007 Statut Membre Dernière intervention 3 décembre 2014 2
15 août 2008 à 12:27
Salut alors bon....

Pour commencer oui explode permet de construire un tableau.
Dans le
$a1 = explode( '|', $chaine );


le '|' permet de determiner a quel endroit sera coupé ta chaine $chaine :
$a1 = array( 
[0] =>0,
[1] =>1,
....
[12] => 132,
[13] => 133,
...);


Pour en revenir a ton probleme je l'ai déjà eu et j'ai mis un moment a trouver d'où cela venait !

En fait dans mon cas c'était la définition des champs de ma table qui était fausse.

En gros je fesait :
INSERT INTO table_a ('id', 'text', 'indice', 'sexe')VALUES ('', 'je m'appelle francky', '0', 'masculin');


Alors que mon champs text était de type varchar(4)

PAr conséquent il ne m'introduisait pas ce que je lui demandais !

CA le fait aussi si tu fait :
INSERT INTO table_a ('id', 'text', 'indice', 'sexe')VALUES ('', 'je m'appelle francky', '0');


Dans le VALUES il faut mettre le nombre de champs que ta table contient ! ;)
0
Ok ok, exacte. Je vais essayer en ajoutant NULL pour mon champ ID.
Le type de mon champ image est TINYTEXT, cela me semble correcte non ?
0
Après une tentative avec le code suivant, rien n'a changé .... bizarre tout de même :

while ($i==1)
  {

    $rand = rand(0,143);
			
    $a1 = explode( '|', '0|1|2|3|4|5|6|7|8|9|10|11|132|133|134|135|136|137|138|139|140|141|142|143' );
    $a2 = explode( '|', '12|24|36|48|60|72|84|96|108|120|23|35|47|59|71|83|95|107|119|131' );
			
    if(in_array( $rand, $a1 ))
	{
	  $riveH = "INSERT INTO casesmap (`ID`, `image`) VALUES (NULL, '<img src=\"../images/riveH.png\" alt=\"\" />') WHERE ID = '".$rand."'";
	  $query3 = mysql_query($riveH, $connexion);
	  $i=0;
	}
    elseif(in_array( $rand, $a2 ))
	{
	  $riveD = "INSERT INTO casesmap (`ID`, `image`) VALUES (NULL, '<img src=\"../images/riveD.png\" alt=\"\" />') WHERE ID = '".$rand."'";
	  $query4 = mysql_query($riveD, $connexion);
	  $i=0;
	}
    else { $rand = rand(0,143); }

  }
0
balou01 Messages postés 83 Date d'inscription mardi 26 juin 2007 Statut Membre Dernière intervention 3 décembre 2014 2
15 août 2008 à 18:24
Mais ta table casemap est constitué comment ? de quels champs ?
0
Voilà la structure de ma table. Je ne copie pas le contenu car ce sont des entrées qui vont de 1 à 143 :

Base de données ile

Structure de la table casesmap
Champ Type Null Défaut
ID tinyint(3) Oui NULL
image tinytext Oui NULL

Contenu de la table casesmap
0
1
2
3
...

Je vais essayer ta fonction pour l'introduction de code HTML et je te fais part de mes découvertes. Merci.
0
balou01 Messages postés 83 Date d'inscription mardi 26 juin 2007 Statut Membre Dernière intervention 3 décembre 2014 2
15 août 2008 à 18:34
ah....

je crois avoir vu ton erreur....

si tu utilise :
INSERT INTO casesmap (`ID`, `image`) VALUES (NULL, '<img src=\"../images/riveH.png\" alt=\"\" />') WHERE ID = '".$rand."'";


ca veut dire que ton entrée existe déjà...

A cemoment la ce n'est pas un "INSERT INTO" qui faudrait faire mais un "UPDATE"

essai ca :
UPDATE casesmap SET image = '<img src=\"../images/riveH.png\" alt=\"\" />' WHERE ID = '".$rand."'";


ajuste le pour l'autre requete SQL ! ;)
0
kryoportail Messages postés 222 Date d'inscription dimanche 10 août 2008 Statut Membre Dernière intervention 22 mai 2014 125
15 août 2008 à 18:44
Re,

Oui, 'balou01' a raison, ta gestion du champs 'ID' parait un peu flou !.... Pourquoi la définir systématiquement à NULL !???

Car faire INSERT INTO .... WHERE ... en fait, n'a aucun sens....

Donc soit tu veux créer un nouvel objet 'casesmap' en base de données dans ce cas tu fais :
INSERT INTO casesmap (`image`) VALUES ('<img src=\"../images/riveH.png\" alt=\"\" />');
Soit tu veux le mettre à jour (parce qu'il existe déjà)
UPDATE casesmap SET `image`= '<img src=\"../images/riveH.png\" alt=\"\" />' WHERE `ID` = '".$rand."'";

Dans le cas d'une insertion, mieux vaut déclarer ton champ 'ID' non null, Primary KEY, et AUTOINCREMENT...

Amicalement,
S@M...
http://kryoportail.ath.cx
0
Désolé je n'ai pas eu le temps de me pencher sur vos réponse, mais quand je l'aurais, je vous tiendrais au courant c'est promis. Merci en tout cas pour votre générosité et votre aide.
Bonne journée
0
dans tous les langages de programmation qui me sont familiers, rand ou son equivallent retourne un nombre reel entre 2 limites. ne connaissant pas votre langage de programmation, essayez de voir de ce cote.
0
balou01 Messages postés 83 Date d'inscription mardi 26 juin 2007 Statut Membre Dernière intervention 3 décembre 2014 2
19 août 2008 à 10:47
le problème ne vient pas d'ici ! ;)

Le nombre est bien généré correctement ! ;)
0
Ok e, fait je stocke le code HTML dans une varialbe et après j'insère la variable dans ma table.
J'ai testé avec un autre programme, ça fonctionne donc je pense que ca devrait fonctionné avec ce programme aussi.
Comme je n'ai pas le temps de m'en occuper (trop de boulot !) j'essaierais plus tard, mais à mon avis la solution est là.
Merci à tous.

PS : problème résolu.
0