2015-04-20 2 views
0

Je d:/data/pics ce dossier, avec des photos, appelées 1101-a.jpg1101-b.jpg, 1102-a.jpg, 1102-b.jpg etc. Pics a et b toujours le même nombre - notons que a et b sont simplement une représentation du texte après la partie «nombre». mais pour chaque nombre il y a toujours 2 résultats.obtenir les noms pic de dossiers avec PHP - puis rechercher les numéros en eux, puis insérez dans la table MySQL pour chaque numéro respectivement

Et j'ai une base de données MySQL avec une table 'pics'. Il contient les colonnes 'id', 'number', 'title1' et 'title2'. La colonne 'nombre' a déjà 1101, 1102, 1103 etc.

Je dois rechercher toutes les images du répertoire, extraire les nombres de leurs noms, rechercher les mêmes nombres dans ma table MySQL et insérer les noms de photos appropriés dans la base de données. Pour chaque numéro, il y a deux photos.

Maintenant, je sais comment obtenir les noms du répertoire, mais je ne parviens pas à l'insérer dans la base de données, car j'ai deux photos du même numéro que j'ai besoin de jumeler avec la même ligne dans mon mySQL. Je ai écrit court sans échapper à simplifier le problème autant que je le pouvais.

+0

Votre insert ressemble un peu bizarre. Vous inscrivez deux colonnes dans votre liste de colonnes ('title1' et' title2'), mais une seule valeur '$ row'. De plus, vous avez une clause where. Mysql (et la plupart des bases de données) ne supporte pas une clause 'where' dans un insert. 'where' est pour' select', 'update' et' delete' où 'insert' sert à ajouter de nouvelles lignes, sans faire référence aux existantes. –

+0

je suis d'accord c'est bizarre :) ... et que je devrais utiliser UPDATE semble logique. merci, je vais essayer quelque chose avec ça. –

+0

Alors laissez-moi vérifier quelque chose, tout ce que vous devez faire est de mettre à jour la table 'images', mettre' title1' au premier nom d'image trouvé et 'title2' à la seconde où le numéro existe dans la base de données? aucune autre colonne ne doit être modifiée à droite? Qu'en est-il des images qui n'ont pas de numéro dans la base de données ou vice versa avec des lignes qui n'ont pas d'image? –

Répondre

1

je ferais quelque chose comme ceci:

$images = glob("d:/data/images/*-a.{jpg,png,jpeg}", GLOB_BRACE)); 
foreach($images as $img){ 
$path_parts = pathinfo($img); 
$img = $path_parts['basename']; 
$ext = $path_parts['extension']; 

$imge = explode('-',$img); 
$pic_number = $imge[0]; 

$file1 = $pic_number."-a.".$ext; 
$file2 = $pic_number."-b.".$ext; 

..... 
} 
+0

utilisez ['basename'] (http://www.php.net/basename) pour obtenir le nom de fichier au lieu de string_replace. –

+0

également si nous supposons que toutes les images ont un homologue A et B alors simplement indexer la colonne nombre comme unique et faire un INSERT IGNORE quark –

+0

dépend si OP tente de faire réellement un insert ou mettre à jour des enregistrements existants. C'est tout ce que mon commentaire était à propos car il est apparu OP essayait d'insérer des valeurs dans un enregistrement existant qui est vraiment une mise à jour. –

0

solution à deux boucles est la voie à suivre imo. Mise à jour multi-rangée efficace est possible si vous définissez index unique sur number colonne (que vous devriez de toute façon). Vous pourriez utiliser la clause MySQL ON DUPLICATE KEY UPDATE puis. Avant d 'utiliser le code ci-dessous être sûr d'avoir un index unique sur la colonne number (unique id ne suffit pas):

$img_files = glob("files/*.{jpg,JPG,png,PNG,jpeg,JPEG}", GLOB_BRACE); 
$data = array(); 
foreach ($img_files as $img_file) { 
    $filename = basename($img_file); 
    $split_filename = explode('-', $filename, 2); 
    $number_prefix = (int) $split_filename[0]; 
    $data[$number_prefix][] = $filename; 
} 

// assuming 0 can't be prefix number $data[0] represents invalid file (without number prefix) - not needed aparently 
// unset($data[0]); 

$insert_values = ''; 
foreach ($data as $number => $row) { 
    $title1 = $row[0]; 
    $title2 = isset($row[1]) ? $row[1] : ''; // empty string in case there's no second file 
    $insert_values .= "('$number','$title1','$title2'),"; 
} 

$sql = 'INSERT INTO images (number, title1, title2) VALUES ' . substr($insert_values, 0, -1) . ' 
     ON DUPLICATE KEY UPDATE title1 = VALUE(title1), title2 = VALUE(title2)'; 
//... run query 

sans index UPDATE requêtes sont faciles à construire dans la deuxième boucle (nombre et ont deux noms de fichiers).

Edit: UPDATE Version bouclée:

//... $insert_values not needed 
foreach ($data as $number => $row) { 
    $title1 = $row[0]; 
    $title2 = isset($row[1]) ? $row[1] : ''; // empty string in case there's no second file 
    $sql = "UPDATE images SET title1 = '$title1', title2 = '$title2' WHERE number = $number"; 
    // ... execute query 
} 
+0

Encore une fois cela fonctionne partiellement (j'ai dû supprimer [0] dans le synthax supérieur et les valeurs. = dans le bas mais ensuite cela a fonctionné partiellement - les valeurs insert _ $ jaillissent bien, tous ($ nombre, $ title1, $ title2) mais sql devrait être UPDATE pas insérer quelque chose comme sql = mettre à jour les images SET numéro = $ nombre, titre1 = $ titre1, titre2 = $ titre2 O num engourdi er = $ nombre ... mais ça ne marche pas ... même si je pense que c'est la voie à suivre; ici, c'est juste la question de synthax –

+0

Comme je l'ai écrit. Vous pouvez le faire avec la requête 'UPDATE' à l'intérieur de la boucle. C'est une astuce spéciale 'INSERT ... ON DUPLICATE KEY UPDATE' qui permet plusieurs mises à jour dans une seule requête (la partie'. = 'N'est pas une erreur). Je vous écris ci-dessous le scénario "UPDATE" dans un instant. – shudder

+0

malheureusement, avec celui-ci je reçois faux résultat nombre de $ (au lieu de 1101, pour un fichier 1101-sometext.jpg et 1101-someothertext.jpg) je reçois 1 pour autant d'images que j'ai il affiche tableau de ones ... donc la mise à jour ne fonctionnera pas :( –