使用准备好的语句。它们是为此目的而设计的。此外,您应该注意,以您实际执行的方式构建 SQL 查询容易受到 SQL 注入的攻击。或者换句话说,这是易受攻击代码的最佳示例。如果黑客发布 SQL 语句怎么办?准备好的语句将防止这种情况发生,因为它将查询数据与查询语法分开。
在 PHP 中,您可以使用PDO
准备好的 statemtens(以及其他扩展)。这里有一个简短的例子:
$pdo = new PDO('...');
$stmt = $pdo->prepare('SELECT FROM table WHERE id=:id AND title=:title ...');
$stmt->execute(array('id' => 1, 'title' => 'test'));
更新:
在评论中你说你必须使用 mysql_* 扩展。如果这样做,您应该知道,您必须转义每个值以防止 SQL 注入。像这样:
// first(!!!) connect to mysql. this is important because
// mysql_real_escape_string() will need information about
// the current connection's encoding to work properly
if(!mysql_connect(...) && mysql_select_db(...)) {
die('mysql connection error');
}
// escape values
$id = mysql_real_escape_string($_POST['id']);
$title = mysql_real_escape_string($_POST['title']);
...
// now you could just use double quotes `"` to insert vars into the query string:
mysql_query("SELECT * FROM `table` WHERE id = $id AND title = '$title'");
如果您需要此附加信息:
注意:有一种称为curly 语法的语法{}
,可用于访问双引号"
字符串中的数组。我没有在示例中使用它,因为不建议将 post vars 放在查询中而不先转义它们。然而,这里有一个语法示例:
$array = array('foo' => 'bar');
$string = "Hello {$array['foo']}";