[RESOLU] Erreur sql

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : [RESOLU] Erreur sql

Re: [RESOLU] Erreur sql

par allhambra » 12 sept. 2015, 10:21

Bonjour Ryle,
merci pour ta réponse :). C'est la plateforme d'une application de la fac, je ne suis donc pas sûre de pouvoir la passer en InnoDB sans tout chambouler :(.
Je vais voir avec mes collègue si c'est possible.
Un grand merci en tout cas pour cette piste.

Re: [RESOLU] Erreur sql

par Ryle » 09 sept. 2015, 12:24

Chaque requête doit effectivement être exécuté indépendamment des autres, il n'y a donc pas de solution php pour optimiser ton code. En revanche, la question à se poser est "est-ce que toutes ces suppressions en cascade ne pourraient-elles pas être gérées par le système d'intégrité de la base de données ?"

Pour cela il suffirait sans doute de passer tes tables en InnoDB et de définir des clés étrangères vers ta table user avec une suppression en cascade. Ainsi le fait de supprimer un élément dans la table user supprimerait automatiquement tous les enregistrements associés dans les autres tables... Côté php, il n'y aura qu'une seule requête à exécuter pour supprimer l'utilisateur et MySQL fera le reste :)

Re: Erreur sql

par allhambra » 07 sept. 2015, 14:07

Bonjour,
Merci de ta réponse, comment faire alors ? Vu le nombre de tables impactées je voulais éviter les inner join :(
Je n'ai plus d'erreur en splitant les requêtes mais je suis persuadée qu'il doit y avoir une méthode plus propre, non ?

Code : Tout sélectionner

if (isset($_POST['suppr'])) { mysql_select_db($database_chamilo, $chamilo); $ids = implode(', ', $_POST['suppr']); $supprimer = "DELETE FROM `user` WHERE `user_id` IN(".$ids.");"; mysql_query($supprimer, $chamilo) or die('Erreur SQL !'.$supprimer.'<br />'.mysql_error().'<br />'); $supprimer2 = "DELETE FROM `gradebook_result` WHERE `user_id` IN(".$ids.")"; mysql_query($supprimer2, $chamilo) or die('Erreur SQL !'.$supprimer.'<br />'.mysql_error().'<br />'); $supprimer3 = "DELETE FROM `gradebook_result_log` WHERE `user_id` IN(".$ids.")"; mysql_query($supprimer3, $chamilo) or die('Erreur SQL !'.$supprimer.'<br />'.mysql_error().'<br />'); $supprimer4 = "DELETE FROM `gradebook_linkeval_log` WHERE `user_id_log` IN(".$ids.")"; mysql_query($supprimer4, $chamilo) or die('Erreur SQL !'.$supprimer.'<br />'.mysql_error().'<br />'); $supprimer5 = "DELETE FROM `gradebook_link` WHERE `user_id` IN ($ids)"; mysql_query($supprimer5, $chamilo) or die('Erreur SQL !'.$supprimer.'<br />'.mysql_error().'<br />'); ....
Je prend toute astuce pour optimiser :)

Re: Erreur sql

par allhambra64 » 07 sept. 2015, 13:28

Bonjour,
Merci de ta réponse, comment faire alors ? Vu le nombre de tables impactées je voulais éviter les inner join :(

Re: Erreur sql

par or 1 » 07 sept. 2015, 12:51

extrait de la doc : "mysql_query() envoie une seule requête (les requêtes multiples ne sont pas supportées) "

Erreur sql

par allhambra64 » 07 sept. 2015, 12:06

Bonjour,

je tente une suppression multiple via case à cocher dans un formulaire, mais la validation me renvoie une erreur sql.

<form id="form1" name="form1" method="post" action="">
<table width="100%" border="0" cellpadding="5">
<tr>
<td>Nom</td>
<td>Prénon</td>
<td>Login</td>
<td>ID</td>
<td><img src="../img/delete.gif" width="16" height="16" /></td>
</tr>
<?php do { ?>
<tr>
<td><?php echo $row_Recordset1['lastname']; ?></td>
<td><?php echo $row_Recordset1['firstname']; ?></td>
<td><?php echo $row_Recordset1['username']; ?></td>
<td><?php echo $row_Recordset1['user_id']; ?></td>
<td>
<input name="suppr[]" type="checkbox" id="suppr" value="<?php echo $row_Recordset1['login_user_id']; ?>" />

</td>
</tr>
<?php } while ($row_Recordset1 = mysql_fetch_assoc($Recordset1)); ?>
<tr>
<td></td>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td><input type="submit" value="Supprimer" /></td>
</tr>
</table>
</form>
<?php

if (isset($_POST['suppr'])) {
mysql_select_db($database_chamilo, $chamilo);
$ids = implode(', ', $_POST['suppr']);

//echo $ids.'<br>';

$supprimer = "
DELETE FROM user` WHERE `user_id` IN(".$ids.");
DELETE FROM `gradebook_result` WHERE `gradebook_result.user_id` IN(".$ids.");
DELETE FROM `gradebook_result_log` WHERE `user_id` IN(".$ids.");
DELETE FROM `gradebook_linkeval_log` WHERE `user_id_log` IN(".$ids.");
DELETE FROM `gradebook_link` WHERE `user_id` IN ($ids);
DELETE FROM `gradebook_certificate` WHERE `user_id` IN(".$ids.");
DELETE FROM `gradebook_evaluation` WHERE `user_id` IN(".$ids.");
DELETE FROM `gradebook_category` WHERE `user_id` IN(".$ids.");
DELETE FROM `group_rel_user` WHERE `user_id` IN(".$ids.");
DELETE FROM `notification` WHERE `dest_user_id` IN(".$ids.");
DELETE FROM `message` WHERE `user_sender_id` IN(".$ids.") OR `user_receiver_id` IN(".$ids.");
DELETE FROM `track_e_attempt` WHERE `user_id` IN(".$ids.");
DELETE FROM `track_e_access` WHERE `access_user_id` IN(".$ids.");
DELETE FROM `track_e_course_access` WHERE `user_id` IN(".$ids.");
DELETE FROM `track_e_default` WHERE `default_user_id` IN(".$ids.");
DELETE FROM `track_e_hotspot` WHERE `hotspot_user_id` IN(".$ids.");
DELETE FROM `track_e_exercices` WHERE `exe_user_id` IN(".$ids.");
DELETE FROM `track_e_downloads` WHERE `down_user_id` IN(".$ids.");
DELETE FROM `track_e_links` WHERE `links_user_id` IN(".$ids.");
DELETE FROM `track_e_lastaccess` WHERE `access_user_id` IN(".$ids.");
DELETE FROM `track_e_online` WHERE `login_user_id` IN(".$ids.");
DELETE FROM `track_e_login` WHERE `login_user_id` IN(".$ids.");
DELETE FROM `user_field_values` WHERE `user_id` IN(".$ids.");
DELETE FROM `track_e_uploads` WHERE `upload_user_id` IN(".$ids.");
DELETE FROM `user_course_category` WHERE `user_id` IN(".$ids.");
DELETE FROM `user_rel_user` WHERE `user_id` IN(".$ids.") OR `friend_user_id` IN(".$ids.")
";
mysql_query($supprimer, $chamilo) or die('Erreur SQL !'.$supprimer.'<br />'.mysql_error().'<br />');

// on affiche le résultat pour le visiteur
echo 'Vos infos on été supprimées.';
}
?>