在PHP / mySQL查询中转义连字符

时间:2010-10-06 10:16:38

标签: php

以下行会引发错误:

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

问题是连字符“ - ”

我可以轻松地用“_”更改“ - ”,但我想知道是否有可能逃脱该角色以供将来参考。

提前致谢

3 个答案:

答案 0 :(得分:5)

要防止SQL注入,您应该转义输入。然后使用sprintf获取可读性并使用引号作为数组的索引。如果你不使用引号PHP将sender-email视为未定义的常量,并假设你实际上是指字符串“sender-email”。如果在某些时候你定义了发送者 - 电子邮件,你的代码可能会破坏。

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

答案 1 :(得分:1)

首先,正如您的代码所代表的那样,您很容易受到SQL注入攻击 - 您应该真正关注参数化查询。

我不确定您使用的数据库类型,我会使用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();
}

有关使用mysqli准备好的语句的更多信息,请查看the mysqli prepare documentation

答案 2 :(得分:0)

应为$_POST['sender-email']

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