Php 如何在SQL中使用单引号检查名称?

Php 如何在SQL中使用单引号检查名称?,php,mysql,Php,Mysql,我使用下面的代码从DB中检查lastname(区分大小写) 它的工作很好。但是,当名称如下所示时,它不起作用,我使用php变量($lname)传递这个姓氏 如何解决此问题?您需要用一个单引号转义所有单引号: SELECT * FROM BL12_anncurtis_existing_customers WHERE BINARY LastName LIKE 'O''Connor' SELECT * FROM BL12_anncurtis_existing_customers WHERE BINA

我使用下面的代码从DB中检查lastname(区分大小写)

它的工作很好。但是,当名称如下所示时,它不起作用,我使用php变量($lname)传递这个姓氏


如何解决此问题?

您需要用一个单引号转义所有单引号:

SELECT * FROM BL12_anncurtis_existing_customers WHERE BINARY LastName LIKE 'O''Connor'
SELECT * FROM BL12_anncurtis_existing_customers WHERE BINARY LastName LIKE "O'Connor"

您可以自己编写一个使用正则表达式匹配引号的小程序,该程序可以验证并修复用户所犯的错误。

这应该是可行的

SELECT * FROM BL12_anncurtis_existing_customers WHERE BINARY LastName LIKE 'O\'Connor'

当然,对于php,您有mysql_escape或所有PDO准备的语句,这些语句将自动处理此问题,因为您使用的类似值绑定到php变量。

在php脚本中构建查询时,请对正在搜索的值使用函数:

$query = "SELECT * FROM BL12_anncurtis_existing_customers WHERE BINARY LastName LIKE '" . addslashes($name) . "'"
这将转义任何需要它的字符,并将产生您正在寻找的结果

另一种解决方案是在查询中使用双引号,而不是单引号:

SELECT * FROM BL12_anncurtis_existing_customers WHERE BINARY LastName LIKE 'O''Connor'
SELECT * FROM BL12_anncurtis_existing_customers WHERE BINARY LastName LIKE "O'Connor"
但我想我更喜欢第一种解决方案

WHERE BINARY LastName LIKE "O'Connor"
这对我有用


我认为
\'
可能更好,但两者都有效

您应该使用
mysql\u real\u escape\u string()

如果你打开了magic_quotes_gpc(你应该知道这是个坏主意)。这意味着从$\u GET、$\u POST和$\u COOKIES收集的字符串将为您转义(即,“O'Connor”->“O'Connor”)


存储数据并随后再次检索数据后,从数据库返回的字符串将不会自动为您转义。你会得到“奥康纳”的。因此,您需要通过mysql\u real\u escape\u string()传递它。

您只需要转义单引号。我有一个类似的问题。这个问题的答案可能对你有用。我使用php变量($lname)传递这个姓氏。选择*FROM$table_name,其中二进制LastName如“$last_name”@Ravichandran:在传递变量时,也可以使用addslashes,即addslashes($lname)我使用php变量($lname)传递这个姓氏。从$table\u name中选择*,其中二进制LastName(如“$last\u name”)永远不会这样做!!!它是SQL注入天堂!!!PHP SQL字符串中使用的每个PHP变量至少应该通过mysql_real_escape_字符串传递,或者如果使用PDO,则使用准备好的语句。
WHERE BINARY LastName LIKE "O'Connor"