Php 准备好的MySQLi中的通配符返回错误值

Php 准备好的MySQLi中的通配符返回错误值,php,mysql,Php,Mysql,有关最新信息和当前状态,请参阅本文底部 以下是类似这样的帖子的建议: 我已经设置了我的语句,它可以正常工作,没有错误。但它不会返回正确的数据 我的select语句包含以下内容: WHERE `Name` LIKE ? order by `Name` 我的字符串设置绑定,然后是实际绑定 $whatToBind = '%'. $whatName .'%'; $stmt = $mysqli->prepare($selectStr); $stmt->bind_param('s',

有关最新信息和当前状态,请参阅本文底部

以下是类似这样的帖子的建议:

我已经设置了我的语句,它可以正常工作,没有错误。但它不会返回正确的数据

我的select语句包含以下内容:

 WHERE `Name` LIKE ?  order by `Name`
我的字符串设置绑定,然后是实际绑定

$whatToBind = '%'. $whatName .'%';

$stmt = $mysqli->prepare($selectStr);
$stmt->bind_param('s', $whatToBind);
$stmt->execute();
当我得到报税表时,它将完全丢失它应该匹配的记录。 比如,如果我发送“肯·L”,我会得到“肯·林顿”的唱片,但不会是“肯·劳顿”。如果我输入“劳顿”,我就得不到任何回报

这是典型的全面行为。如果我搜索电话号码字段,我在“658”上得到返回,但在“609-658”上没有返回

如果有人能告诉我我错过了什么,那就太好了

示例返回显示了我所指的确切示例:

不完整:

空的,但不应该是:

返回所有,包括应与其他2一起存在的记录:

要回答的问题: 需要检查的其他事项:

检查MySQL/PHP交互字符集设置是否正确,通常使用:$mysqli->set_charset(“utf8mb4”);在数据库连接建立之后

设置为utf8。尽管在设置之前它的行为相同。

您可以显示$mysqli->error的任何输出吗

没有错误。只是不完整的回报

您可以向我们展示您的整个SQL查询吗

它包含在屏幕抓取中。虽然,这只是一个简单的字符串。而且这并不能说明准备好的声明是什么样子的。

您能显示Names列的Collation/MySQL结构吗

根据GoDaddy的phpMyAdmin,全部为utf8

您能在绑定之前显示$whatName的正确值吗

它位于屏幕抓取的顶部。在其他任何事情发生之前,它会回显出来。

在这一点上,我认为问题在于当我搜索的字段有一个空格或其他不是字母的字符时会发生什么。不是我要说的。但更像是,一旦语句准备好,准备的内容与它正在搜索的字段中的内容不匹配。在空间存在之前搜索字段时,不会发生这种情况。这就是为什么“肯”在100%的时间里工作,而“劳顿”却完全失败了。在太空之后

我尝试了各种方式转换编码类型。我尝试了各种连接字符串的方法。我得到的结果不是更好,就是完全打破它

如果还有人有任何想法的话,这笔赏金还有21个小时。
在这一点上,我会更高兴地奖励25个给这两个家伙,他们提供了最好的信息。奖励一个而不是另一个似乎不公平。

这可能是
$whatName
中的某种混合编码问题

检查
$whatName
变量编码是否为UTF8

mb_detect_encoding($whatName, 'UTF-8', true) // should return true
如果没有,则必须在
$whatName
上使用
mb\u detect\u encoding
mb\u convert\u encoding
将其转换为utf8

如果你还没有这样做

设置适当的字符集

$mysqli->set_charset('utf8mb4'); 
// if your MySQL version is lower than 5.5.3 then
// use $mysqli->set_charset('utf8'); 
在你准备好的声明之前

$stmt = $mysqli->prepare($selectStr);
$stmt->bind_param('s', $whatToBind);
$stmt->execute(); 
请注意,此答案的详细信息不太可能自行解决问题。通过我自己的进一步测试,我确定在绑定字符串之前向字符串添加
%
\
通配符不会影响它们绑定到查询的方式

您当前试图做的是将数据(
$whatName
)与SQL指令
%
连接在一起,而Prepared语句解析器根本没有这个功能,因为它破坏了prepard语句的安全性

因此,解决方案是,您只需要在插入点手动将变量连接到LIKE语句中,而不是像现在这样在插入点之前

下面的示例将按照您的意愿执行:

$selectStr = WHERE `Name` LIKE CONCAT('%',?,'%') ORDER BY `Name`
$whatToBind = $whatName;
$stmt = $mysqli->prepare($selectStr);
$stmt->bind_param('s', $whatToBind);
$stmt->execute();
请注意,在执行准备好的语句之前,
数据
查询
从不混合


关于MySQL上的UTF-8和字符集的说明:

不要使用
utf8\uu
MySQL字符集,因为它们是真正的UTF-8的不完整子集,因此仍然会引起字符识别的严重问题。相反,您希望使用
utf8mb4
字符集/排序规则/etc

字符编码可能与您的问题有关,我强烈建议您阅读上给出的优秀答案,并使用PHP
mb


需要检查的其他事项:

  • 检查MySQL/PHP交互字符集设置是否正确,通常使用:
    $mysqli->set_字符集(“utf8mb4”)建立数据库连接后立即执行

  • 您能否显示
    $mysqli->error
    的任何输出

  • 您可以向我们展示您的整个SQL查询吗

  • 能否显示
    名称
    列的排序规则/MySQL结构

  • 您能否在绑定之前显示
    $whatName
    的值?(虽然你的问题有道理,但有一个特定情况、特定结果以及预期结果的特定示例对于我们调试非常有用

  • 愚蠢的事情,但要确保你的结果没有限制


这是您的数据的问题。准备好的语句与此无关。尝试使用相同的数据进行常规查询。并不是说我不愿意接受这个想法。但我正在搜索VARCHAR字段。这些字段中的数据中没有任何异常。您能给我一个示例,说明我的数据是如何被弄乱的吗?因此运行