尝试查询 MySQL 数据库时,如何在 PHP 中转义引号?
在不增加addslashes
每个值的情况下:
$fname = addslashes("Value's with quote''s'");
$lname = addslashes("Value's with quote''s'");
尝试查询 MySQL 数据库时,如何在 PHP 中转义引号?
在不增加addslashes
每个值的情况下:
$fname = addslashes("Value's with quote''s'");
$lname = addslashes("Value's with quote''s'");
正确的方法是使用准备好的语句,例如通过PDO。
如果你不能这样做,你必须处理所有传入数据库查询的值mysql_real_escape_string()
- 而且不,简单地对所有$_POST
数据执行此操作不是一个选项,因为这会使它们无法用于 HTML 输出等。你可以虽然创建一个$_ESC
或类似的东西......但请注意,这个变量不会是超全局的!
您应该在每个字符串值上转义特殊字符(不仅是引号)(转义您不会在查询中用引号括起来的值是没有用的。这些值需要另一种处理)。
为了避免无聊的重复输入,您可以将转义函数应用于循环中的数组项。
如果您使用 MySQL 并进行 INSERT/UPDATE 查询,您可以使用这个辅助函数:
function dbSet($fields) {
$set = '';
foreach ($fields as $field) {
if (isset($_POST[$field])) {
$set .= "`$field`='" . mysql_real_escape_string($_POST[$field]) . "', ";
}
}
return substr($set, 0, -2);
}
它是这样使用的:
$id = intval($_POST['id']);
$table = 'users';
$fields = explode(" ","name surname lastname address zip fax phone");
$query = "UPDATE `$table` SET ".dbSet($fields).", `date`=NOW() WHERE id=$id";
也不要忘记使用mysql_real_escape_string()函数mysql_set_charset()
所需的设置正确的编码。
一个好主意是使用此处描述的 PDO 准备语句。
它会自动转义这些字符。
首先,不要使用addslashes()
- 不建议与转义数据库查询字符串一起使用,因为它不会转义实际需要转义的所有内容;有些角色仍然可以通过。
正确的解决方案取决于您使用的数据库。假设您使用的是 MySQL,那么要使用的正确函数addslashes()
是mysql_real_escape_string()
.
您可能会注意到,在每一行上使用 this 甚至比 更加冗长addslashes()
,因此它并不能真正回答您的问题。
如果您的字段都是单独的变量(根据您的示例),那么您真的会为一堆代码行做这件事。
如果您使用的是数组(例如$_POST
),那么您可以在循环中执行它,这将使事情变得更加整洁 - 您可以执行以下操作:
foreach($_POST as $key=>$value) {
$sqlstrings[$key]="`".$key"` = '".mysql_real_escape_string($value)."'";
}
$sql = "update table ".implode(' ',$sqlstrings)." where id=".$update_id;
执行 SQL 的一种更新方法是使用对象模型而不是手动构建查询。PHP 有许多库可能会有所帮助:mysqli
它是一个改进的 MySQL 库,并且PDO
是一个与数据库无关的库。与直接构建 SQL 代码相比,其中任何一个都可以为您提供更好的安全性和灵活性。但是,如果您已经有很多代码,那么它们将代表相当大的代码更改开销,因此您可能希望mysql_real_escape_string()
在短期内使用上面讨论的选项。不过,我确实建议对它们进行投资。