php – 通配符在准备的MySQLi中返回错误的值
请参阅这篇文章的最下面的最新信息和当前状态
遵循这样的帖子的建议: 我有我的声明设置,它的工作没有错误.但它不会返回正确的数据. 我的select语句对于WHERE来说是这样的: WHERE `Name` LIKE ? order by `Name` 我的字符串设置绑定,然后实际绑定. $whatToBind = '%'. $whatName .'%'; $stmt = $mysqli->prepare($selectStr); $stmt->bind_param('s',$whatToBind); $stmt->execute(); 当我得到我的回报,它将完全错过它应该匹配的记录. 这是全面的典型行为.如果我搜索电话号码字段,我得到“658”的返回值,但在“609-658”上没有返回. 如果有人可以告诉我我失踪了什么,那将是巨大的. 示例返回,显示我所指的确切示例: 未完成: 空,虽然不应该是: 返回全部,包括应该与其他2的记录: 问题回答:
它设置为utf8.虽然在此之前表现相同.
没有错误.只是不完全的回报
它包含在屏幕抓取中.虽然这只是一个简单的字符串.而且它不会说明准备好的语句的样子.
这是所有utf8根据GoDaddy的phpMyAdmin
它在屏幕抓取的顶部.在任何其他事情发生之前,它都回覆了. 在这一点上,我认为问题在于当我正在搜索的字段有一个不是一个字母的空格或其他字符时会发生什么.不是我正在传递的.但更像是,一旦声明准备好准备什么是不匹配什么是现场正在搜索.当您在空间存在之前搜索该字段时,不会发生这种情况.这就是为什么“肯”工作100%的时间,但“劳顿”完全失败了.这是在空间之后. 我已经尝试过各种转换的编码类型.我已经尝试了串联字符串的各种方法.我得到的结果不是更好,完全打破它. 还有21个小时留下这个赏金,如果有任何人有更多的想法.
您当前正在尝试的是将数据($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的值吗? (虽然您的问题是有道理的,具体具体情况和具体结果以及预期结果对我们来说非常有用.>傻的事情,但确保你的结果没有限制! (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |