0
votes

Comment charger un fichier TXT à l'aide de PHP et de boucle via des contenus pour interroger une base de données

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);
?>


4 commentaires

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 votre boucle au lieu de le faire sur chaque itération? De plus, si images_file_name 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 "; , bien que vous deviez utiliser des déclarations préparées.


Vous n'avez pas besoin de vérifier si ($ link === false) à 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); en bas, après le pendant {...} boucle peut-être


3 Réponses :


0
votes

Vous devez mettre des devis dans '$ line' de sorte que la variable n'est pas traitée comme un nom de colonne xxx

vous devez lire des déclarations préparées cependant Comme vous êtes ouvert à l'injection SQL


0 commentaires

1
votes

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));
 }

}


0 commentaires

0
votes

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) ... XXX < / pré>

Notez également que j'ai changé le SQL de comme ... à = ... supposant que le nom est une correspondance exacte au contenu .


0 commentaires