Php 使用pdo在搜索变量中使用冒号(:)进行查询

Php 使用pdo在搜索变量中使用冒号(:)进行查询,php,mysql,pdo,Php,Mysql,Pdo,我有一个恼人的问题。我正在尝试做一些简单的事情,比如从db中获取单元格值。 这是使用db可以做的最基本的事情。。。给我一个值,其中有一个单元格具有此值 问题是搜索查询包含冒号(:)。 我在一个有准备语句的类中使用pdo函数,但运气不好。 我已经尝试了所有的方法,甚至分割了查询,使其不包含冒号,但仍然没有成功。我已经尝试恢复到mysqli,但仍然是相同的结果 数据表包含title->Morlanda C:2和sourceID->S11等值。 顺便说一句,如果我试图在phpmyadmin中搜索一个标

我有一个恼人的问题。我正在尝试做一些简单的事情,比如从db中获取单元格值。 这是使用db可以做的最基本的事情。。。给我一个值,其中有一个单元格具有此值

问题是搜索查询包含冒号(:)。 我在一个有准备语句的类中使用pdo函数,但运气不好。 我已经尝试了所有的方法,甚至分割了查询,使其不包含冒号,但仍然没有成功。我已经尝试恢复到mysqli,但仍然是相同的结果

数据表包含title->Morlanda C:2和sourceID->S11等值。 顺便说一句,如果我试图在phpmyadmin中搜索一个标题,我会在寻找Morlanda C:2时得到我想要的

但是当我调用我的函数时:

$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);