boucle dans une requete mysql

Eléphant du PHP | 259 Messages

05 nov. 2005, 19:04

bonjour

j'ai un petit problème avec une requête sql

voici le code
<?
mysql_connect('sql.free.fr','*****','7*******');
mysql_select_db('******');
$init = mysql_query("DELETE FROM a_ban_active");
$init2 = mysql_query("ALTER TABLE a_ban_active AUTO_INCREMENT=0");
$active = mysql_query("SELECT ban_id, user_id FROM a_ban WHERE ban_credits>0");
while($insert = mysql_fetch_assoc($active))
{
mysql_query("INSERT INTO a_ban_active VALUES('',$insert['user_id'],$insert['ban_id'])");
}
mysql_close();
?>
et en affichant la page

sa me met sa
T_ENCAPSED_AND_WHITESPACE, expecting T_STRING or T_VARIABLE or T_NUM_STRING in /var/www/sdc/0/8/yuu.sw/echange/frames/frame_ban_1.php on line 29
la ligne 29 est celle ci
mysql_query("INSERT INTO a_ban_active VALUES('',$insert['user_id'],$insert['ban_id'])");

qu'est ce qui ne vas pas ???
l'hébergeur gratuit que j'utilisais: http://www.freeheberg.com (pas de limitte de débit, BP, 1à10Go, bdd mysql illimitées )
mainteant je suis chez OVH, payant mais plus adapté à de gros sites

Eléphant du PHP | 259 Messages

05 nov. 2005, 19:35

personne ne peut m'aider ???
l'hébergeur gratuit que j'utilisais: http://www.freeheberg.com (pas de limitte de débit, BP, 1à10Go, bdd mysql illimitées )
mainteant je suis chez OVH, payant mais plus adapté à de gros sites

Mammouth du PHP | 1311 Messages

05 nov. 2005, 19:39

essaye comme ceci
mysql_query('INSERT INTO a_ban_active VALUES("",'.$insert['user_id'].','.$insert['ban_id'].')"');

Eléphant du PHP | 259 Messages

05 nov. 2005, 19:42

nan

sa ne marche toujours pas
Parse error: parse error, unexpected T_ENCAPSED_AND_WHITESPACE, expecting T_STRING or T_VARIABLE or T_NUM_STRING in /var/www/sdc/0/8/yuu.sw/echange/frames/frame_ban_1.php on line 29
l'hébergeur gratuit que j'utilisais: http://www.freeheberg.com (pas de limitte de débit, BP, 1à10Go, bdd mysql illimitées )
mainteant je suis chez OVH, payant mais plus adapté à de gros sites

Modérateur PHPfrance
Modérateur PHPfrance | 7636 Messages

06 nov. 2005, 03:07

décompose et regarde ce que donne la requete génèrée:
$sql="INSERT INTO a_ban_active VALUES('',".$insert['user_id'].",".$insert['ban_id'].")";
mysql_query($sql);
en passant il me semble que les variables sont des id donc numérique donc pas de quotes

/!\ Avant de poster se documenter et rechercher.
Qui ne sait pas rendre un service n'a pas le droit d'en demander.
MaBrute

Eléphant du PHP | 80 Messages

06 nov. 2005, 03:21

Bah, un peu avant ta ligne, tu tapes
while ($insert = mysql_fetch_assoc($active)) {
$userid=$insert['user_id'];
$banid=$insert['ban_id'];

 $sql="INSERT INTO a_ban_active VALUES('',"$userid","banid")"; 
mysql_query($sql);
}
Si tu as des conditions, tu les rajoutes après le while, et hop !

Non ? Enfin, bien sur, c'est un par un moi que je verrais ça...

Tu peux juste préciser pourquoi tu fais une boucle ?
XaV...
Webmaster des Larmes du Chaos

ViPHP
ViPHP | 656 Messages

06 nov. 2005, 04:50

J'ai essayé de faire ça mais j'ai une petite erreur sur la requête.

J'ai la flème de la corriger, si quelqu'un passe par là, peut-être qu'il pourra te modifier ça.

Enfin ça c'est ma vision de ton script, à toi de voir ce que ça vaut.
<?php

$cct = mysql_connect("localhost", "root", "");
mysql_select_db("try", $cct);

class __Req_Sql {
	var $insert;
	var $sql = array();
	var $init = array();

	function sql() {
		$this->init[] = "SELECT ban_id, user_id FROM a_ban WHERE ban_credits='3'";
		$this->init[] = "INSERT INTO a_ban_active VALUES ('', ".$this->insert["user_id"].", ".$this->insert["ban_id"].");";
		
		foreach ($this->init as $this->sql) {
			while ($this->insert = mysql_fetch_array(mysql_query($this->sql[0]))) {
				mysql_query($this->sql[1]);
			}
		}
	}
}

$req = new __Req_Sql;

if ($req->sql()){
	echo "Success";
}
else {
	echo "Unable";
}

mysql_close(); 

?>

Mammouth du PHP | 19672 Messages

06 nov. 2005, 09:57

Pourquoi faire deux requêtes où une seule suffirait ???

Là, tu fais une première requête e'extraction de données suivie d'une requête d'insertion: tu pourrais combiner les deux en une seule et unique requête sans faire la moindre boucle. Ça ressemblera à ceci:
$transfert = "INSERT INTO `a_ban_active`(`a_user_id`, `a_ban_id`) SELECT ban_id, user_id FROM a_ban WHERE ban_credits > 0";
Note, ajuste les noms des champs dans lesquels tu insères les données, comme on indique pas de clé primaire, il faut précider les champs sur lesquels on effectue l'opération.
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Eléphant du PHP | 259 Messages

06 nov. 2005, 16:16

maintenant j'ai ceci
Warning: mysql_fetch_assoc(): supplied argument is not a valid MySQL result resource in /var/www/sdc/0/8/yuu.sw/echange/frames/frame_ban_1.php on line 8

Warning: mysql_num_rows(): supplied argument is not a valid MySQL result resource in /var/www/sdc/0/8/yuu.sw/echange/frames/frame_ban_1.php on line 39

Warning: mt_rand() expects parameter 2 to be long, string given in /var/www/sdc/0/8/yuu.sw/echange/frames/frame_ban_1.php on line 42
la ligne 8 est
$resultats = mysql_fetch_assoc($envoie);
la ligne 39 est
$compter2 = mysql_num_rows($compter1);
et la ligne 42 est :
$rand = mt_rand(0,'$compter2');
je vous mais le code en entier

ligne 3
<?
mysql_connect('sql.free.fr','xxx','xxx');
mysql_select_db('yuu_sw');
$select = "SELECT ban_id, user_id, ban_fond, ban_color, ban_color2, ban_credits, ban_affichage FROM a_ban WHERE ban_id='$frame_id'";
$envoi = mysql_query($select);
$resultats = mysql_fetch_assoc($envoie);

$id1 = $resultats['ban_id'];
$id2 = $resultats['user_id'];
$fond = $resultats['ban_fond'];
$color = $resultats['ban_color'];
$color2 = $resultats['ban_color2'];
$credits1 = $resultats['ban_credits'];
$affiche = $resultats['ban_affichage'];

mysql_close();
?>

<?
mysql_connect('sql.free.fr','xxx','xxx');
mysql_select_db('yuu_sw');
$init = mysql_query("DELETE FROM a_ban_active");
$init2 = mysql_query("ALTER TABLE a_ban_active AUTO_INCREMENT=0");
$active = mysql_query("SELECT ban_id, user_id FROM a_ban WHERE ban_credits>0");
while($insert = mysql_fetch_assoc($active))
{
$sql="INSERT INTO a_ban_active VALUES('',".$insert['user_id'].",".$insert['ban_id'].")"; 
mysql_query($sql); 
}
mysql_close();
?>

<?
mysql_connect('sql.free.fr','xxx','xxx');
mysql_select_db('yuu_sw');
$compter1 = mysql_query("SELECT FROM a_ban_active");
$compter2 = mysql_num_rows($compter1);

$nombre = '$compter2';
$rand = mt_rand(0,'$compter2');

$select_active = mysql_query("SELECT ban_id FROM a_ban_active WHERE active_id='$rand'");
$resultat_active = mysql_fetch_assoc($select_active);
$ban_id_active = '$resultat_active';

$emp = mysql_fetch_assoc(mysql_query("SELECT ban_id, ban_emp, ban_lien, ban_credits, ban_affiche FROM a_ban WHERE ban_id='$ban_id_active'"));

$id3 = $emp['ban_id'];
$ban_emp = $emp['ban_emp'];
$ban_lien = $emp['ban_lien'];
$credits2 = $emp['ban_credits'];
$affiche = $emp['ban_affiche'];

mysql_close();
?>
<?
$new_credits1 = $credits1+1;
$new_credits2 = $credits2-1;
$new_affichage = $affichage+1;
$new_affiche = $affiche+1;

mysql_connect('sql.free.fr','xxx','xxx');
mysql_select_db('yuu_sw');
mysql_query("UPDATE a_ban SET ban_credits='$new_credits1' WHERE ban_id='$id1'");
mysql_query("UPDATE a_ban SET ban_credits='$new_credits2' WHERE ban_id='$id3'");
mysql_query("UPDATE a_ban SET ban_affiche='$new_affiche' WHERE ban_id='$id3'");
mysql_query("UPDATE a_ban SET ban_affichage='$new_affichage' WHERE ban_id='$id1'");

mysql_close();
?>
qu'est ce qui ne vas pas ?????
l'hébergeur gratuit que j'utilisais: http://www.freeheberg.com (pas de limitte de débit, BP, 1à10Go, bdd mysql illimitées )
mainteant je suis chez OVH, payant mais plus adapté à de gros sites