我有一个烦人的问题。我正在尝试做一些简单的事情,例如从数据库获取单元格值。
这是您可以使用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了。

关于禁用模拟准备好的语句的评论,我的答案是..是吗? :)
现在,在本文中,我找到了您在谈论关于仿真的内容:Best way to prevent SQL injection?,并更新了我的构造函数类。我仍然得到相同的结果。

我正在为我的数据库连接使用此构造函数类:
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];

和:
   $orginalString = "Morlanda C:2";

他们不匹配。
进行了类型检查,但都as了出来。
我开始认为这是旧的UTF8编码问题,这让我很困扰。
我的数据库,表和单元格设置为utf8_unicode_ci。
pdo连接为UTF8,并已使用Notepad++使用“带UTF-8的ANSI”(不带BOM)对php文件进行了编码。

这里的整个项目是将家谱注释转换为源代码,以便我从同一数据库中的表中收集一个长字符串,然后将其分解,然后将一些片段组装成上述的sourceTitle。然后,我搜索数据库以查看源是否已经存在,如果不存在,则仅创建一个新源。数据收集和搜索sourceTilte由同一pdo类完成。

更新3

你好

那是一个愚蠢的空白空间或类似的东西。
我确实在$ sourceTitle变量上使用trim,但没有在explode函数的数组中的每个片段上使用。当我这样做时,它奏效了。我想这是最后一个电话,或者是最后一个让我感到困惑的电话。

感谢您的帮助,我现在终于可以将我的3000个笔记转换为来源了:)
下一个项目是如何防止我的脚本自定义阻塞我的VPS ...

最佳答案

绑定(bind)的数据不需要以任何方式进行转义。这几乎是绑定(bind)参数的全部要点。您的问题不是数据中没有冒号。您很可能已经在代码或实际的数据库记录中输入了标题。

无关紧要的是,对于您的用例,最好使用bindValue()而不是bindParam():

$stmt->bindValue(':sourceTitle', $sourceTitle);

养成使用bindValue()的习惯,除非您知道需要按引用绑定(bind)(在这种情况和类似情况下,您只使用一次该值,因此无需按引用绑定(bind))。

关于php - 用冒号查询(:) in the search variable using pdo,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13324660/

10-16 17:19