【发布时间】:2013-12-18 13:56:35
【问题描述】:
我有一个查询,我想在其中匹配 fname 和 lname
$result = $mysqli->query('SELECT * FROM user WHERE userId = "'.$_SESSION["userId"].'" AND FriendFirstName = "'.htmlentities($firstName, ENT_QUOTES,"UTF-8").'" AND FriendLastName = "'.htmlentities($lastName, ENT_QUOTES,"UTF-8").'" AND FriendStatusCode="verified" AND friendId!='.$fid.' AND ViewableRow <> "0" ') or die($mysqli->error);
echo 'SELECT * FROM user WHERE userId = "'.$_SESSION["userId"].'" AND FriendFirstName = "'.htmlentities($firstName, ENT_QUOTES,"UTF-8").'" AND FriendLastName = "'.htmlentities($lastName, ENT_QUOTES,"UTF-8").'" AND FriendStatusCode="verified" AND friendId!='.$fid.' AND ViewableRow <> "0" ';
如果我有一个名字 John'y,那么它不会产生任何结果,它不会返回任何行,我会回显查询,如果我运行相同的查询,我会在我的 sql 中得到结果。
输出变成这样
SELECT *
FROM user_friend_detail
WHERE userId = "9306" AND FriendFirstName = "Aa\'tid"
AND FriendLastName = "Kenddy"
AND FriendStatusCode="verified" AND friendId!=9366 AND ViewableRow "0"
它在mysql中返回行。我关闭了魔术引号,我认为这是一个非常简单的问题,但它浪费了我很多时间。
The FNAME is Aa'tid
The lname is Kenddy
我错过了什么吗?
【问题讨论】:
-
HTML 转义和反转义是必需的。
-
@duffymo htmlentites 用于相同目的
-
这是
htmlentities根据文档 (php.net/htmlentities) 的预期行为。我会退后一步,考虑在 MySQLi 中使用准备好的语句(参见php.net/manual/en/mysqli.quickstart.prepared-statements.php),而不是直接将字符串添加到查询中并在 PHP 中转义它们。无论如何,这是一种更优雅、更安全的做法,而且它可以匹配引号而不会出现复杂情况。 -
@Anton 我试过了,如何在 select 的情况下从准备好的语句中获取结果,$stmt->bind_param('issi', $_SESSION['userId'], $firstName, $lastName, $fid); $stmt->执行();
标签: php mysql sql magic-quotes-gpc mysql-escape-string