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

dur*_*isn 10 php mysql

有关最新信息和当前状态,请参阅此帖子的底部

按照这样的帖子提供建议: 在准备好的声明中使用通配符 - MySQLi

我已经设置了我的语句,它没有错误.但它没有返回正确的数据.

我的select语句对WHERE有这个:

 WHERE `Name` LIKE ?  order by `Name`
Run Code Online (Sandbox Code Playgroud)

我的字符串设置绑定,然后是实际绑定.

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

$stmt = $mysqli->prepare($selectStr);
$stmt->bind_param('s', $whatToBind);
$stmt->execute();
Run Code Online (Sandbox Code Playgroud)

当我得到回报时,它将完全错过它应该匹配的记录.就像,如果我发送"Ken L",我会收回"Ken Linton"的记录,而不是"Ken Lawton".如果我投入"劳顿",我根本得不到任何回报.

这是全面的典型行为.如果我搜索电话号码字段,则返回"658",但"609-658"不返回.

如果有人能够让我了解我所缺少的东西,那就太好了.

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

未完成: 在此输入图像描述

空,虽然它不应该是: 在此输入图像描述

返回all,包括应该与其他2的记录: 在此输入图像描述

要回答的问题: 还有一些要检查的事项:

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

它被设置为utf8.虽然在设置之前它的行为相同.

你能显示$ mysqli-> error的任何输出吗?

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

你能告诉我们你的整个SQL查询吗?

它包含在屏幕抓取中.虽然,这只是一个简单的字符串.并且它没有考虑准备好的声明的样子.

你能展示Names专栏的Collat​​ion/MySQL结构吗?

根据GoDaddy的phpMyAdmin,它都是utf8

你能在绑定之前展示$ whatName的价值吗?

它位于屏幕抓取的顶部.在其他任何事情发生之前,它回应显示它.

在这一点上,我认为问题在于当我搜索的字段有空格或其他不是字母的字符时会发生什么.不是我准确传递的东西.但更像是,一旦准备好陈述,准备的东西就不匹配它所搜索的领域.当您在空间存在之前搜索字段时,不会发生这种情况.这就是为什么"肯"在100%的时间里工作,但"劳顿"完全失败.它是在空间之后.

我尝试了各种方式转换编码类型.我已经尝试了连接字符串的各种方法.我得到的结果要么不是更好,要么彻底打破它.

如果有人有更多的想法,还有21个小时的奖励.在这一点上,我会更乐意为每个提供最佳信息的两个人提供25个奖励.奖励一个而不是另一个似乎是不公平的.

Mar*_*tin 5

请注意,此答案的详细信息本身不太可能解决问题。通过我自己的进一步测试,我确定在绑定字符串之前向字符串附加%或通配符不会影响它们绑定到查询的方式。_

您当前正在尝试做的是将数据 ( ) 与它两侧的$whatNameSQL 指令连接起来,而准备语句解析器根本不具备此功能,因为它违背了准备语句的安全目的。%

因此,解决方案是您需要仅在插入点(而不是之前)手动将变量连接到 LIKE 语句中,就像您目前所做的那样。

下面的示例将按照您的意图进行:

$selectStr = WHERE `Name` LIKE CONCAT('%',?,'%') ORDER BY `Name`
$whatToBind = $whatName;
$stmt = $mysqli->prepare($selectStr);
$stmt->bind_param('s', $whatToBind);
$stmt->execute();
Run Code Online (Sandbox Code Playgroud)

请注意,在执行准备好的语句之前,dataquery 永远不会混合。


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

不要使用utf8_MySQL 字符集,因为它们是真正 UTF-8 的不完整子集,因此仍然会引发严重的字符识别问题。相反,您想使用utf8mb4_字符集/排序规则/等。

字符编码可能是与您的问题相关的问题,我强烈建议阅读此 Stack Overflow Question上给出的优秀答案以及使用 PHPmb_ 多字节字符串函数


还有一些需要检查的事情:

  • 检查MySQL/PHP交互字符集设置是否正确,通常为:$mysqli->set_charset("utf8mb4");数据库连接建立后。

  • 你能显示任何输出吗$mysqli->error

  • 您能向我们展示您的整个SQL 查询吗?

  • 你能显示列的排序规则/MySQL 结构吗Names

  • $whatName你能在绑定之前显示 的值是什么吗?(虽然你的问题是有道理的,但拥有特定情况和特定结果的特定示例以及预期结果对于我们调试非常有用。

  • LIMIT愚蠢的事情,但请确保您的结果不会受到影响!:-D