2010-12-15 80 views
1

Les valeurs du tableau $ rf contiennent un point:Comment faire pour échapper un point dans la requête mysql?

$rf = array(img34563.jpg , img34536.jpg); 

    $query = "SELECT * FROM $appin_table WHERE img IN (".implode(',' , $rf).""; 
    $result = mysql_query($query) 
    or die(mysql_error()); 

Comment pourrais-je échapper au point, est-ce possible?

Merci d'avance.

+0

Quels sont les contenus de la matrice - chaîne ou numérique? Quel est le type de données de la colonne 'img'? –

+0

Peut-être une réponse stupide, mais êtes-vous sûr que vous ne voulez pas dire '$ rf = array (" img34563.jpg "," img34536.jpg ");'? – Inaimathi

+0

Les valeurs proviennent d'une variable post contenant le type de valeurs que j'ai noté ici, j'ai essayé d'ajouter les guillemets mais cela n'a pas aidé. –

Répondre

2

Échapper le point seul ne vous aidera pas; vous vous retrouverez avec une requête comme:

SELECT * FROM table WHERE img IN(img34563.jpg , img34536.jpg) 

Vous devez appliquer des citations avant:

function quote($k) 
    { 
     return '"' . mysql_real_escape_string($k) . '"'; 
    } 

$values = array_map('quote', $rf); 
$query = "SELECT * FROM $appin_table WHERE img IN (".implode(',' , $values).""; 
+0

Essayé, ne fonctionne pas: Vous avez une erreur dans votre syntaxe SQL; consultez le manuel qui correspond à votre version du serveur MySQL pour la bonne syntaxe à utiliser près de 'jpg, 1292426006.jpg, 1292426169.jpg, 1292426916.jpg' à la ligne 1 –

+0

Hm. Je sais pourquoi vous avez eu cette erreur. La dernière ligne dit 'implode (',', $ rf)' mais cela aurait dû être 'implode (',', $ values)'. J'ai édité –

+0

Merci, ça marche! Il y a un ')' manquant dans le code ci-dessus, entre les deux dernières doubles guillemets. –

2

Pour éviter échapper, utiliser une instruction préparée:

$rf = array('img34563.jpg', 'img34536.jpg'); 

$db_connection = new mysqli("localhost", "user", "pass", "db"); 
$statement = $db_connection->prepare("SELECT * FROM $appin_table WHERE img IN (?,?)"); 
$statement->bind_param("ss", $rf[0], $rf[1]); 
$statement->execute(); 

Plus d'informations: http://www.php.net/manual/en/mysqli.prepare.php

+0

toujours utiliser des instructions préparées si possible –

+0

Merci pour votre réponse. Pourquoi les déclarations préparées sont-elles meilleures que les escapades? –

+0

@Ben: Les instructions préparées sont très utiles pour éviter les injections SQL, car elles séparent l'instruction SQL des valeurs réelles. –