2010-06-04 5 views
1

J'écris beaucoup d'informations d'un fichier XML dans une base de données.Insérer des données en utilisant PHP dans mysql quand il contient un '

Tout fonctionne bien jusqu'à ce que je tombe sur un champ avec la version 'dans la description, que l'insertion échoue avec une erreur

Error 

1064:You have an error in your SQL syntax; check the manual that 

correspond à votre serveur MySQL pour la bonne syntaxe à utiliser près J'aimerais que tu ressentes ça aussi. Nous aimerions vous compter parmi nous visiter pour voir plus de 100' à la ligne 3

Est-il possible d'avoir cette insérée sans elle échouer? le fichier d'importation peut être volumineux et changer régulièrement, donc je ne peux pas rechercher et remplacer les caractères qu'il contient.

Ma réelle Déclaration PHP est:

$query = mysql_query("REPLACE into list 
(id, name, link, description, cost, date_added,type,myipaq,private,imgurl) 
VALUES ('$id','$name','$link',"'$description'",'$cost','$date','$type','$myipaq','$private','$imgurl')"); 

merci à l'avance,

Greg

+0

Je ne suis pas un mec PHP ou un mec MySQL, mais pouvez-vous faire une sorte de HTML ENCODE pour l'encoder? Ensuite, vous pouvez HTML DECODE pour l'afficher à nouveau. –

+0

Ah ... le gourou dit qu'il s'appelle mysql_real_escape_string - Je pense que c'est le même concept que l'encodage html –

+0

Pourquoi $ description a-t-il des guillemets autour de lui? Cela ne causera-t-il pas d'erreurs PHP puisqu'elles ne sont pas échappées? Et les erreurs MySQL si elles sont échappées? –

Répondre

6

Cette tombe dans la catégorie d'injection SQL.

En PHP une fonction: mysql_real_escape_string est utilisée pour encoder une chaîne de sorte que rien de cela ne puisse affecter l'instruction SQL dans laquelle elle pourrait être concaténée. Alors assurez-vous que toutes vos valeurs passent par la fonction mysql_real_escape_string et tout ira bien.

API REF: http://php.net/manual/en/function.mysql-real-escape-string.php

+0

Jeez NO. -1, malgré tous les votes positifs. La chaîne d'échappement réelle colle au mieux au plâtre, la seule façon de le faire correctement est d'utiliser des instructions préparées. – Cruachan

+0

* donc assurez-vous que toutes vos valeurs passent par la fonction mysql_real_escape_string et tout ira bien. * Cette déclaration est trompeuse et fausse. C'est une amélioration, mais pas une solution totalement fiable. – Cruachan

1

Il suffit de passer vos données via mysql_real_escape_string()

+2

Pour clarifier, passez chaque valeur à travers cette fonction avant de créer la chaîne de requête. Vous n'utilisez pas la fonction sur l'ensemble de la requête. –

+0

Non, utilisez des instructions préparées. -1 pour suggérer le contraire. – Cruachan

0

Utilisez ma fonction dandy à portée de main:

function mysql_safe_string($value) { 
    if(is_numeric($value))  return $value; 
    elseif(empty($value))  return 'NULL'; 
    elseif(is_string($value)) return '\''.mysql_real_escape_string($value).'\''; 
    elseif(is_array($value)) return implode(',',array_map('mysql_safe_string',$value)); 
} 

function mysql_safe_query($format) { 
    $args = array_slice(func_get_args(),1); 
    $args = array_map('mysql_safe_string',$args); 
    $query = vsprintf($format,$args); 
    $result = mysql_query($query); 
    if($result === false) echo '<div class="mysql-error"><strong>Error: </strong>',mysql_error(),'<br/><strong>Query: </strong>',$query,'</div>'; 
    return $result; 
} 

comme ceci:

mysql_safe_query('INSERT INTO table VALUES (%s, %s, %s)', $val1, $val2, $val3); 

Et oublier de citer ou non citer vos cordes et écrivant mysql_real_escape_string une douzaine de fois.

+0

Pas une mauvaise idée. Et si leur tableau contient déjà ',' cependant? –

+0

@Brendan: Que voulez-vous dire? Si les valeurs dans le tableau ont déjà des virgules de fin? Ils seront cités et insérés dans la BD avec les virgules ... qui ont downvoted cela? – mpen

+0

J'ai voté parce que quelqu'un avait déjà voté en bas (et je pense que c'est une bonne idée). Ce que je demandais cependant, est ce que si elles obtiennent ce tableau: '{" x "," y ",", "}'? Ne sera-t-il pas converti en: "x, y ,,", alors quand il est retourné dans un tableau: '{" x "," y "," "," "}'? –

0

La seule manière vraiment sûre d'insérer ou de remplacer ou d'interagir avec quoi que ce soit sur une base de données avec PHP est d'utiliser des instructions préparées. Il n'y a plus aucune excuse pour le faire autrement. Échapper des chaînes en utilisant mysql_real_escape_string vous donnera une certaine protection, mais ce n'est pas une preuve à l'épreuve des balles.

Les instructions préparées ne sont même pas difficiles.Voir la page PHP manual sur eux, et il ya plusieurs wrappers pour rendre la vie encore plus facile, personnellement, j'aime beaucoup le codesense mysqli wrapper et l'utilise depuis un certain temps sans aucun problème - ce n'est pas plus dur que le code PHP MySQL droite. EasyPDO semble prometteur aussi.

Vous devriez consulter la question connexe "PHP: Is mysql_real_escape_string" sufficient for cleaning user input" pour plus de détails sur les raisons pour lesquelles vous ne devriez pas être paresseux.

+0

+1 pour vrai mais plus difficile à utiliser –

+0

@Brendan, pas beaucoup plus difficile à utiliser du tout, surtout si vous utilisez un emballage. Franchement, si le codage de quelqu'un est d'un niveau où ils sont contestés par des déclarations préparées, ils devraient abandonner et aller faire quelque chose d'autre. – Cruachan

Questions connexes