Php 使用pdo在搜索变量中使用冒号(:)进行查询
我有一个恼人的问题。我正在尝试做一些简单的事情,比如从db中获取单元格值。 这是使用db可以做的最基本的事情。。。给我一个值,其中有一个单元格具有此值 问题是搜索查询包含冒号(:)。 我在一个有准备语句的类中使用pdo函数,但运气不好。 我已经尝试了所有的方法,甚至分割了查询,使其不包含冒号,但仍然没有成功。我已经尝试恢复到mysqli,但仍然是相同的结果 数据表包含title->Morlanda C:2和sourceID->S11等值。 顺便说一句,如果我试图在phpmyadmin中搜索一个标题,我会在寻找Morlanda C:2时得到我想要的 但是当我调用我的函数时:Php 使用pdo在搜索变量中使用冒号(:)进行查询,php,mysql,pdo,Php,Mysql,Pdo,我有一个恼人的问题。我正在尝试做一些简单的事情,比如从db中获取单元格值。 这是使用db可以做的最基本的事情。。。给我一个值,其中有一个单元格具有此值 问题是搜索查询包含冒号(:)。 我在一个有准备语句的类中使用pdo函数,但运气不好。 我已经尝试了所有的方法,甚至分割了查询,使其不包含冒号,但仍然没有成功。我已经尝试恢复到mysqli,但仍然是相同的结果 数据表包含title->Morlanda C:2和sourceID->S11等值。 顺便说一句,如果我试图在phpmyadmin中搜索一个标
$sourceID = $sources->sourceAvalibe('Morlanda C:2');
我正在访问我的功能:
public function sourceAvalibe($sourceTitle){
try {
$sql = "SELECT sourceID FROM sources WHERE title=:sourceTitle";
$core = Core::getInstance();
$stmt = $core->dbh->prepare($sql);
$stmt->bindParam(':sourceTitle', $sourceTitle, PDO::PARAM_STR, 32);
$stmt->execute();
$row = $stmt->fetch(PDO::FETCH_ASSOC);
return $row;
}
那么结果将为空
但是如果我这样调用函数:
$sourceID = $sources->sourceAvalibe('1910 Massachusetts Census');
结果将返回我正在查找的内容
如果查询包含冒号(:),则结果为空;如果查询包含没有冒号(:)的内容,则返回正确的sourceID
我试过用不同的方法逃出结肠,但也找不到结果
在我发疯之前,你能帮帮我吗
更新1
嗨
谢谢你的回答。我正在搜索的数据与数据库中使用复制/粘贴的数据完全相同。我已经寻找了邪恶的空白,但没有找到额外的。
我现在改为使用bindValue
关于禁用模拟已准备语句的评论,我的答案是。。(问:)
现在,我在本文中找到了您谈论的关于模拟的内容,并更新了我的构造函数类。我还是得到了同样的结果。。没什么
我将此构造函数类用于我的db连接:
class Core {
public $dbh;
private static $instance;
function __construct(){
$this->dbh = new PDO("mysql:host=$db_host;dbname=$db_name", $db_user, $db_pass,
array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8",
PDO::ATTR_EMULATE_PREPARES => false));
}
public static function getInstance(){
if (!isset(self::$instance)){
$object = __CLASS__;
self::$instance = new $object;
}
return self::$instance;
}
}
更新2
嗨
当我将搜索值(Morlanda C:2)硬编码到我的sql行中时,一切都正常工作。因此,我对php生成的标题进行了比较:
$sourceTitle = $sourcePreTitle." ".$preTitleNumber[0].":". $preTitleNumber[1];
与:
他们不匹配。
做了一次类型检查,但结果都是刺痛。
我开始认为是旧的UTF8编码问题困扰着我。
我的数据库、表和单元格设置为utf8\U unicode\U ci。
pdo连接是UTF8,并使用记事本++使用“ANSI with UTF-8”(无BOM)对php文件进行编码
这里的整个项目是将一个系谱注释转换成一个源代码,所以我从同一个数据库中的一个表中收集一个长字符串,然后分解它,然后将一些片段组装成上面所示的源代码标题。然后我搜索数据库以查看源是否已经存在,如果不存在,那么我只创建一个新的源。数据收集和SourceTilt搜索由同一个pdo类完成
更新3
嗨
这是一个愚蠢的空白或类似的东西。。。。
我确实在$sourceTitle变量中使用了trim,但没有在explode函数中的数组中的每个片段上使用trim。当我这么做的时候,它成功了。我猜是最后一个数字后的一个尾声或是什么让我感到困惑
感谢您的帮助,我现在终于可以将我的3000张笔记转换为源:)
下一个项目是如何防止自定义脚本阻塞VPS…绑定的数据不需要以任何方式转义。这几乎就是bind参数的全部要点。您的问题不是数据中有冒号。很可能是您在代码或实际数据库记录中键入了标题 另一方面,对于您的用例,最好使用
bindValue()
而不是bindParam()
:
$stmt->bindValue(':sourceTitle', $sourceTitle);
养成使用
bindValue()
的习惯,除非您知道需要通过引用进行绑定(在本例和类似情况下,您只使用一次值,因此不需要通过引用进行绑定)。参数绑定到位,不需要转义或引用。您确定有一行与Morlanda C:2完全匹配吗?冒号不应该干扰。您是否碰巧将MySQL与PDO一起使用,是否忘记禁用对已准备语句的模拟?
$stmt->bindValue(':sourceTitle', $sourceTitle);