2010-10-06 5 views
2

La ligne suivante renvoie une erreur:Évadez trait d'union en PHP/mySQL requête

$query = "INSERT INTO mail_senders(mailAddress) VALUES ('$_POST[sender-email]')"; 

et le problème est le trait d'union « - »

je pourrais facilement changer « - » avec « _ » mais je aimerait savoir s'il est possible d'échapper à ce caractère pour référence future.

Merci d'avance

Répondre

5

Pour empêcher l'injection SQL, vous devez échapper votre entrée. Utilisez ensuite sprintf pour plus de lisibilité et utilisez des guillemets pour l'index du tableau. Si vous n'utilisez pas de guillemets, PHP considère l'expéditeur comme une constante indéfinie et suppose que vous voulez dire la chaîne "expéditeur-e-mail". Si, à un moment donné, vous définissez l'expéditeur, votre code sera probablement cassé.

$query = sprintf("INSERT INTO mail_senders(mailAddress) VALUES ('%s')", mysql_real_escape_string($_POST["sender-email"])); 
+0

Brillant! En fait, je savais que je devais échapper à la chaîne malgré le fait que j'ai un Javascript et une validation d'entrée PHP avant d'insérer des données dans le db pour éviter tout problème ... votre solution avec une seule ligne est parfaite;) – Mirko

0

devrait être $_POST['sender-email']

$query = "INSERT INTO mail_senders(mailAddress) VALUES ('{$_POST['sender-email']}')"; 
1

tout d'abord, comme votre code signifie, vous êtes vulnérable à l'injection SQL - vous devriez vraiment regarder des requêtes paramétrées.

Sans être sûr du genre de base de données que vous utilisez, je vais écrire cela en utilisant Mysqli:

$dbUser = 'username'; 
$dbPass = 'password'; 
$dbHost = 'localhost'; 
$dbName = 'databasename'; 

$dbConnection = new mysqli($dbHost,$dbUser,$dbPass,$dbHost); 

$query = "INSERT INTO mail_senders (mailAddress) VALUES (?)"; 
if ($statement = $dbConnection->prepare($query)) { 
    $statement->bind_param('s',$_POST['sender-email']); 
    $statement->execute(); 

    //If this was a select statement, do stuff with result set here... 
    ... 
    ... 
    ... 

    //As this is an insert, you'll probably want to know if you've successfully inserted a row so... 
    if ($statement->affected_rows > 0) { 
     //Snip - update successful. 
    } 

    //And then close the connection 
    $statement->close(); 
} 

Pour plus d'informations sur les commandes préparées avec mysqli, regardez the mysqli prepare documentation.