J'ai un morceau de code que je ne peux tout simplement pas arriver à fonctionner correctement. J'essaie de faire boucler un fichier TXT avec environ 1k lignes avec un nom de fichier sur chacun. Ensuite, bouclez chaque nom de fichier dans une requête MySQL pour supprimer une ligne d'une table si ce nom de fichier correspond.
<?php $handle = fopen("corrupt.txt", "r"); $link = mysqli_connect("localhost", "user", "pass", "listings"); if ($handle) { while (($line = fgets($handle)) !== false) { if($link === false){ die("ERROR: Could not connect. " . mysqli_connect_error()); } $sql = "DELETE FROM images WHERE images_file_name like $line"; if(mysqli_query($link, $sql)){ } else{ echo "ERROR: Could not able to execute $sql. " . mysqli_error($link); } mysqli_close($link); } } else { } fclose($handle); ?>
3 Réponses :
Vous devez mettre des devis dans vous devez lire des déclarations préparées cependant Comme vous êtes ouvert à l'injection SQL p> p> '$ line' code> de sorte que la variable n'est pas traitée comme un nom de colonne
Premier: évitez toujours les requêtes MySQL à l'intérieur des boucles.
// get data as an array $file = file('data.txt'); // check if datasource has at least one line if(count($file) > 0){ // create delete-array $delete = array(); // loop trough each array element foreach($file as $line){ // trim current line $line = trim($line); // check if line is not empty if(!empty($line)){ // add line to delete-array $delete[] = $line; } } // check if delete-array contains at least one item if(count($delete > 0)){ // delete the items in the array from the database mysqli_query($link, "DELETE FROM records WHERE filename IN('".implode("','", $delete)."'") or die(mysqli_error($link)); } }
Utilisation des conseils (très) utiles dans les commentaires et ranger le code un peu, cela utilise des instructions préparées, etc., ferme uniquement le lien à la fin (quelques informations utiles sur Quand dois-je fermer une connexion de base de données dans php? aussi) ... Notez également que j'ai changé le SQL de comme ... code> à
= ... code> supposant que le nom est une correspondance exacte au contenu . p> p>
Vous devez nous dire quel est votre problème. Que se passe-t-il lorsque vous exécutez ce code? En outre, ne serait-il pas préférable de vérifier la connexion avant i> votre boucle au lieu de le faire sur chaque itération? De plus, si
images_file_name code> est une chaîne, vous devez citer la valeur. Cependant, je recommanderais d'utiliser des déclarations préparées à la place.
À une hypothèse - je dirais des citations manquantes dans
comme $ ligne "; code>, bien que vous deviez utiliser des déclarations préparées.
Vous n'avez pas besoin de vérifier
si ($ link === false) code> à l'intérieur de la boucle, une fois après la connexion.
Cela aiderait à savoir quelle erreur ou quel comportement que vous obtenez, mais: vous fermez la connexion de base de données tout en bouclant sur le fichier, essayez de déplacer
mysqli_close ($ link); code> en bas, après le
pendant {...} code> boucle peut-être