加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

php – 通配符在准备的MySQLi中返回错误的值

发布时间:2020-12-13 16:43:11 所属栏目:PHP教程 来源:网络整理
导读:请参阅这篇文章的最下面的最新信息和当前状态 遵循这样的帖子的建议: Using wildcards in prepared statement – MySQLi 我有我的声明设置,它的工作没有错误.但它不会返回正确的数据. 我的select语句对于WHERE来说是这样的: WHERE `Name` LIKE ? order by
请参阅这篇文章的最下面的最新信息和当前状态

遵循这样的帖子的建议:
Using wildcards in prepared statement – MySQLi

我有我的声明设置,它的工作没有错误.但它不会返回正确的数据.

我的select语句对于WHERE来说是这样的:

WHERE `Name` LIKE ?  order by `Name`

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

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

$stmt = $mysqli->prepare($selectStr);
$stmt->bind_param('s',$whatToBind);
$stmt->execute();

当我得到我的回报,它将完全错过它应该匹配的记录.
喜欢,如果我发送“肯L”,我会收回“肯林顿”的记录,而不是“肯·劳顿”.如果我放入“劳顿”,我根本不会回来.

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

如果有人可以告诉我我失踪了什么,那将是巨大的.

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

未完成:

空,虽然不应该是:

返回全部,包括应该与其他2的记录:

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

Check the MySQL / PHP interaction character set is set correctly,typically with: $mysqli->set_charset(“utf8mb4”); right after database connection is established.

它设置为utf8.虽然在此之前表现相同.

Can you show any output from $mysqli->error ?

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

Can you show us your whole SQL query?

它包含在屏幕抓取中.虽然这只是一个简单的字符串.而且它不会说明准备好的语句的样子.

Can you show the Collation / MySQL structure of the Names column?

这是所有utf8根据GoDaddy的phpMyAdmin

Can you show what the value of $whatName is right before binding?

它在屏幕抓取的顶部.在任何其他事情发生之前,它都回覆了.

在这一点上,我认为问题在于当我正在搜索的字段有一个不是一个字母的空格或其他字符时会发生什么.不是我正在传递的.但更像是,一旦声明准备好准备什么是不匹配什么是现场正在搜索.当您在空间存在之前搜索该字段时,不会发生这种情况.这就是为什么“肯”工作100%的时间,但“劳顿”完全失败了.这是在空间之后.

我已经尝试过各种转换的编码类型.我已经尝试了串联字符串的各种方法.我得到的结果不是更好,完全打破它.

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

Please note that the details on this answer are unlikely to resolve the question on their own. With my own further testing I established that appending % or _ wildcards to strings before they are bound does not effect the way they are bound to the query.

您当前正在尝试的是将数据($whatName)与SQL指令%连接在一起,并且Prepared Statement解析器根本没有这样做,因为它违背了prepard语句的安全性.

所以,解决方案是,您需要手动将变量手动连接到LIKE语句中,只是在插入点,而不是在之前,正如您正在做的那样.

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

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

请注意,数据和查询从不混合,直到准备好的语句被执行.

关于UTF-8和MySQL上的字符集的注释:

不要使用utf8_ MySQL字符集,因为它们是真正UTF-8的不完整子集,因此仍然可能会引起严重的字符识别问题.而是要使用utf8mb4_字符集/整理/等等.

字符编码可能是您的问题的相关问题,我强烈建议您阅读this Stack Overflow Question提供的优秀答案以及使用PHP mb_ multibyte string functions.

还有一些要检查的事情:

检查MySQL / PHP交互角色集是否正确设置,通常为:$mysqli-> set_charset(“utf8mb4”);数据库连接建立后.>您可以显示$mysqli->错误的任何输出?你能告诉我们你的整个SQL查询吗?>你可以显示“名称”列的排序规则/ MySQL结构吗?>你可以在绑定前显示$whatName的值吗? (虽然您的问题是有道理的,具体具体情况和具体结果以及预期结果对我们来说非常有用.>傻的事情,但确保你的结果没有限制!

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读