PDO查询没有导致PHP,但结果是在phpmyadmin或mysql二进制

时间:2016-06-21 16:05:53

标签: php mysql pdo

我很难理解这一点。

我有以下代码:

$result=$db->query(" select `job_id`,`jobs`.`client` 
       from `stores` 
       left join `jobs` 
       on `jobs`.`client`=`stores`.`id` 
       where `stores`.`postcode`='BD5 8HP' 
         and `stores`.`company`='MATALAN' 
         and `jobs`.`description`='MONTHLY external - Clean Both sides of External Glazing, Frames, Ledges & Entrance Doors (up to 1.8m Height) - Including Black out windows - Removing cobwebs and dust from all areas' ")->fetch();
echo "info:";
print_r($result);
die();

查询完全没有返回,也就是$ result是一个空数组。

如果我通过PhpMyAdmin或MySQL二进制客户端(在服务器上)运行完全相同的查询,我得到了结果。

PHP代码是准备 - >执行构造,但由于我得到一个空结果,我试图用直接查询替换它(仅用于测试目的)。

我看了一个关于SO here的一个非常相似的主题,它提出问题与绑定有关,现在我在上面的查询中根本没有绑定,但结果是一个空字符串。 / p>

运行其他查询,例如"select * from table"会返回结果,所以我不知道这里可能出现什么问题。

请问任何想法/建议吗?

作为脚注,我正在对远程服务器运行查询。它可以是charset的东西吗?

修改

虽然我收到了改变DESCRIPTION值的建议,但我不能这样做。该值从PDF中读出,一个位置可以具有相似的值,因此使用LIKE和%对我来说不起作用。我需要得到匹配的确切值。

编辑2 好的问题似乎有点复杂,它的根本原因可能更深一些。如果我手动将字符串写入PHP代码,我会得到正确的结果,但是当我将其作为变量传递时,它似乎不再起作用。这是我脚本的一大块。该脚本正在使用IMAP检查电子邮件,如果电子邮件符合某些规则并且它具有附件,则会打开附件,即PDF,将其转换为文本,提取一些图像并相应地更新数据库。

$invoicedata=$a['attachment'];
                        $descriptorspec = array(
                           0 => array("pipe", "r"),  // stdin is a pipe that the child will read from
                           1 => array("pipe", "w"),  // stdout is a pipe that the child will write to
                           2 => array("file", "/tmp/error-output.txt", "a") // stderr is a file to write to
                        );

                        $cwd = '/tmp';
                        $process = proc_open('pdftotext - -', $descriptorspec, $pipes, $cwd);

                        if (is_resource($process)) {

                            fwrite($pipes[0], $invoicedata);
                            fclose($pipes[0]);
                            $all_text=stream_get_contents($pipes[1]);
                            fclose($pipes[1]);

                            proc_close($process);
                            preg_match("/ARL SUPPORT SERVICES (.*)/",$all_text,$extracted);
                            $company=$extracted[1];
                            preg_match("/[A-Z]{1,2}[0-9][0-9A-Z]?\s?[0-9][A-Z]{2}/",$all_text,$extracted);
                            $postcode=$extracted[0];
                            preg_match("/Date\n*(.*-)/",$all_text,$extracted);
                            $date=trim(str_replace("/","-",str_replace("-","",$extracted[1])));

                            $date=date("Y-m-d H:i:s",strtotime($date));

                            preg_match("/SPECIFICATION:((.|\n)*)EQUIPMENT/",$all_text,$extracted);
                            $job_desc=trim($extracted[1]));

                            preg_match("/Resource\n*(.*)/",$all_text,$extracted);
                            $who_signed=trim(str_replace("-","",$extracted[1]));


                            $db = new PDO('mysql:host=XXX.XXX.XXX.XXX;dbname=ZZZZZZ;charset=utf8', 'USER','PASSWORD');
                            $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

                            $result=$db->query("select `job_id`,`jobs`.`client` from `stores` 
                            left join `jobs` on `jobs`.`client`=`stores`.`id`
                            where `stores`.`postcode`='$postcode' and `stores`.`company`='$company'
                            and `jobs`.`description`='$job_desc'")->fetch();
                        echo "info: ";
                        print_r($result);
                        die();

在这种情况下,$result为空!

如果我这样做:

echo "select `job_id`,`jobs`.`client` from `stores` 
      left join `jobs` on `jobs`.`client`=`stores`.`id`
      where `stores`.`postcode`='$postcode' and `stores`.`company`='$company' and `jobs`.`description`='$job_desc'"
die();

它只会打印:

select `job_id`,`jobs`.`client` from `stores` left join `jobs` on `jobs`.`client`=`stores`.`id` where `stores`.`postcode`='BD5 8HP' and `stores`.`company`='MATALAN' and `jobs`.`description`='MONTHLY external - Clean Both sides of External Glazing, Frames, Ledges & Entrance Doors (up to 1.8m Height) - Including Black out windows - Removing cobwebs and dust from all areas'

如果我将其复制回我的PHP代码中,那么代码会正确执行,因此问题可能出在转换字符的地方。我认为这可能是由于endash / emdash,但检查$job_descord()返回了char 45 - 这是正确的。还有&似乎是正确的。

我的想法已经不多了,有什么东西是如此明显而且没有跳出来的吗?

1 个答案:

答案 0 :(得分:0)

问题与从PDFTOTEXT输出提供的错误ASCII字符有关。

实现str_replace函数确实解决了这个问题。

感谢所有支持/建议。