我很难理解这一点。
我有以下代码:
$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_desc
并ord()
返回了char 45 - 这是正确的。还有&似乎是正确的。
我的想法已经不多了,有什么东西是如此明显而且没有跳出来的吗?
答案 0 :(得分:0)
问题与从PDFTOTEXT输出提供的错误ASCII字符有关。
实现str_replace函数确实解决了这个问题。
感谢所有支持/建议。