est-il possible d'avoir deux requêtes mysqli comme? En gros, je veux mettre à jour deux tables dans mon DB. Y a-t-il un meilleur moyen de le faire? P> P>
3 Réponses :
Il est possible avec mysqli_multi_query () .
Exemple: p>
<?php $mysqli = new mysqli($host, $user, $password, $database); // create string of queries separated by ; $query = "INSERT INTO images (project_id, user_id, image_name, date_created, link_to_file, link_to_thumbnail, given_name) VALUES ('$project_id', '$user_id', '$image_name', '$date_created', '$link_to_file', '$thumbnail', '$ImageName');"; $query .= "INSERT INTO images_history (project_id, user_id, image_name, date_created, link_to_file, link_to_thumbnail, given_name, day, month, year) VALUES ('$project_id', '$user_id', '$image_name', '$date_created', '$link_to_file', '$thumbnail', '$ImageName', '$day', '$month', '$year');"; // execute query - $result is false if the first query failed $result = mysqli_multi_query($mysqli, $query); if ($result) { do { // grab the result of the next query if (($result = mysqli_store_result($mysqli)) === false && mysqli_error($mysqli) != '') { echo "Query failed: " . mysqli_error($mysqli); } } while (mysqli_more_results($mysqli) && mysqli_next_result($mysqli)); // while there are more results } else { echo "First query failed..." . mysqli_error($mysqli); }
Je khow c'est vieux, mais à celui qui utilise toujours MySqli_Multi_Query, comme @ dre010 expliquer: Pour des raisons de sécurité, MySQLI_Query n'exécutera pas plusieurs requêtes pour empêcher les injections SQL i>. Donc, je pense que vous devriez envisager de séparer votre requête en plusieurs requêtes individuelles et d'utiliser la déclaration préparée.
Je suis confus à ce sujet. J'essaie d'adapter cela afin que je puisse dire, si une chaîne est trouvée en recherchant la première table, renvoyez les résultats. S'il n'est pas trouvé en recherchant la première table et on ne trouve pas en recherchant la deuxième table, insérez-le dans la deuxième table. ' Donc, exécutez la première instruction SELECT, mais exécutez uniquement la seconde si la première ne renvoie aucun résultat. Existe-t-il un moyen de différencier entre quelle déclaration de sélection que vous souhaitez utiliser dans le MySQLI_MULTI_QUERY?
@Djdaihatsu Je dirais que je ne ferais pas trop compliquer le code et écrivez simplement les deux sélectionneurs comme requêtes distinctes et ne pas utiliser Multi_Select. En fonction de vos structures de table ou de vos listes de sélection, le moyen de différencier serait de regarder quelles lignes ont été retournées dans le résultat et vous saurez quelle déclaration elle est venue mais qui ajoute une logique inutile supplémentaire qui peut être évitée si vous faites simplement deux Appels séparés vers MySqli_Query.
Merci @ Drew010! Il est donc acceptable d'exécuter plusieurs instructions de sélection distinctes sur différentes tables d'une base de données avant de fermer une connexion? J'ai dû faire une autre erreur quelque part dans mon code car j'ai du mal à retourner des résultats de la deuxième table (dans la même base de données).
@Djdaihatsu complètement acceptable. En utilisant des ensembles de résultats distincts, vous pouvez même émettre des requêtes séparées vers d'autres tables tout en consommant d'autres résultats. Mais il est totalement amentiquement pour émettre plusieurs sélectionneurs sur différentes tables sur la même connexion.
@David L'ironie est, personne n'a demandé B> Comment exécuter deux requêtes "dans un seul appel". Cette réponse n'est pas seulement une contradiction auto-contraire, vous indiquant en même temps que, qui permettant de laisser plusieurs requêtes est dangereuse b> et ensuite d'expliquer comment le faire (comme si MySQLI_MULTI_QUERY est une manière magiquement plus sûre à cet égard); Mais c'est aussi trompeur b>, comme il y a aucune mention b> de requêtes en cours d'exécution en une fois dans la question. L'OP voulait juste courir deux questions, peu importe la façon dont. Et le problème était clairement une erreur sur le second. Probablement la pire réponse sur tout le site de débordement de la pile.
Pour plus de clarté, si vous essayez de presser deux déclarations en un appel MySQLI_Query (), cela n'exercera l'un ni l'autre; Il produira une erreur («Vous avez une erreur dans votre syntaxe SQL»), ce qui est bon pour atténuer l'injection. Cela ne semble pas clair de la documentation.
Une fois et pour tous! Utilisez cette fonction pour obtenir les résultats du nombre illimité de requêtes n'importe où dans votre script. P>
fonction: strong> p> Vous passez simplement la sortie de la requête multiple à la fonction et renvoie tous les résultats et erreurs trouvés dans chaque requête. P>
if(isset($output['error'][2]) && $output['error'][2] !== ""){ echo $output['error'][2]; }else{ while($row = $output['result'][2]->fetch_assoc()) { print_r($row); } }
Voir La réponse ultérieure de votre bon sens RE Security et Injection SQL. Bottom Line: Utilisation de MySQLI_MULTI_QUERY CODE> Ouvre-vous-même à des attaques d'injection SQL. Pour être sûr, ne i> appelle
mysqli_multi_query code>. Au lieu de cela, exiger que l'appelant passe chaque requête distincte comme sa propre chaîne i> b>. Donc, le paramètre d'entrée doit être un éventail de chaînes de requête i>. Ensuite, appelez
mysqli_query code> sur chacun. Vous pouvez toujours emballer des résultats comme vous l'avez fait, mais cela évitera quelques attaques d'injection SQL i> SQL. [ Pour éviter Toutes les attaques i> B>, Paramétrage B> Toutes les requêtes.]
Certaines réponses sur le débordement de la pile sont tellement auto-contradictant que c'est juste l'esprit-soufflant em>. La clé est que vous devez utiliser mysqli_multi_query si vous souhaitez exécuter plus d'une requête dans un seul appel. Pour des raisons de sécurité, MySQLI_Query n'exécutera pas plusieurs requêtes pour empêcher les injections SQL forts>. P>
blockQuote> Il dit essentiellement: "La clé est que vous devez utiliser une arme à feu sans capture de sécurité, car une arme régulière ne vous laissera pas te tirer dessus dans un pied. Alors voici le moyen de la casser bas et maintenant, vous pouvez vous paralyser dans un seul coup! " P> malgré le fait que l'OP n'a pas demandé comment exécuter deux questions dans un seul appel, malgré citant l'avertissement explicite La pire partie, tout ce dangereux et durcien le gâchis est pour rien. Tout simplement parce que essentiellement, je veux mettre à jour deux tables dans ma DB. Y a-t-il une meilleure façon de faire cela? P>
BlockQuote>
Oui bien sûr. Utilisez simplement deux requêtes préparées. H1>
$stmt = $dblink->prepare("INSERT INTO images
(project_id, user_id, image_name, date_created, link_to_file, link_to_thumbnail, given_name)
VALUES (?,?,?,?,?,?,?)");
$stmt->bind_param("ssssss", $project_id, $user_id, $image_name, $date_created, $link_to_file, $thumbnail, $ImageName);
$stmt->execute();
$stmt = $dblink->prepare("INSERT INTO images_history
(project_id, user_id, image_name, date_created, link_to_file, link_to_thumbnail, given_name, day, month, year)
VALUES (?,?,?,?,?,?,?,?,?,?)");
$stmt->bind_param("ssssssssss", $project_id, $user_id, $image_name, $date_created, $link_to_file, $thumbnail, $ImageName, $day, $month, $year);
$stmt->execute();
Possible d'exécuter 2 requêtes, bien sûr, c'est bien sûr.
Vous dites que c'est possible mais ce qui précède ne fonctionne pas. Il ne fait que insérer dans des images mais pas dans images_history.
Eh bien, peut-être que vous devriez vérifier la requête particulière pour des problèmes, son rien à voir avec une autre requête.
@Partisanentity Vous devriez changer
mysql_error () code> à
mysqli_error () code> car les deux sont différents et
mysql_error () code> ne vous donnera aucun message quand Un
MySQLI code> La requête échoue.
Bien sûr, vous pouvez exécuter deux ou dix ou dix numéros de questions. Le nombre n'a pas d'importance. Le problème n'est pas lié au nombre. Il n'y a qu'une erreur lorsque la deuxième requête est exécutée.