查询在MySQL中直接运行或在PHP中使用mysqli,但在PDO中不起作用

查询在MySQL中直接运行或在PHP中使用mysqli,但在PDO中不起作用,php,mysql,pdo,mysqli,Php,Mysql,Pdo,Mysqli,我在MySQL中直接执行以下选择,或者在PHP中使用mysqli,它们的工作与预期一样: MySQL查询: SELECT * FROM `publn_data` WHERE publn_auth = 'EP' AND publn_nr = 2007 SELECT * FROM `publn_data` WHERE publn_auth = 'EP' AND publn_nr = 0002007 两者都给了我预期的结果: id | publn_auth | publn_nr | author

我在MySQL中直接执行以下选择,或者在PHP中使用mysqli,它们的工作与预期一样:

MySQL查询:

SELECT * FROM `publn_data` WHERE publn_auth = 'EP' AND publn_nr = 2007
SELECT * FROM `publn_data` WHERE publn_auth = 'EP' AND publn_nr = 0002007
两者都给了我预期的结果:

id | publn_auth | publn_nr | author  |
09 | EP         | 0002007  | J.Ferri |
这里是PHP中的查询:

$query = "
    SELECT id, publn_auth, publn_nr, author
    FROM publn_data
    WHERE publn_auth = '$publnAuth'
    AND publn_nr = $publnNr";

$result = mysqli_query($mysqli, $query);

while($row = mysqli_fetch_array($result)){
    echo $row['id'].', '.$row['publn_auth'].', '.$row['publn_nr'].', '.$row['author'];
}
这是印在屏幕上的:09,EP,0002007,J.Ferri。如果变量$publnNr=2007或0002007,则没有问题

但是当我使用PDO时,它只在我编写完整的$publnNr=0002007时起作用。当我只写2007时,我没有收到任何结果(也没有错误)

下面是使用PDO的代码:

$sql = '
    SELECT id, publn_auth, publn_nr, author
    FROM publn_data
    WHERE publn_auth = :auth AND
          publn_nr = :nr';

    $q = $conn->prepare($sql);
    $q->execute(array(':auth' => $publnAuth,
                      ':nr' => $publnNr));

    while($r = $q->fetch(PDO::FETCH_ASSOC)){
        echo $r['id'].', '.$r['publn_auth'].', '.$r['publn_nr'].', '.$r['author'];
    }
如果能帮我解决这个问题,我将不胜感激

==编辑===

以下是弗雷德二世评论中提出的一些额外细节-

我从发送$\u POST['publn-in']的表单中获得$publnAuth和$publnNr。 用户通常在字段中写入EP0002007或EP2007。 最后,我做了以下工作(有一些工作要做,但我认为这并不重要):

它根据用户插入的内容相应地给出$publnAuth=EP和$publnNr=0002007或2007

此外,我们在表publn_auth:EP和publn_nr:0002007的列中有

publn_auth char(2)和 第15页

==编辑II==

根据Sebas的评论: 这是我们在“描述公共数据”之后得到的信息:


在MYSQL查询和PHP代码中,您给MYSQL一个整数值,而不是字符串,以与publn_nr(varchar)进行比较。我假设MYSQL隐式地将publ_nr转换为整数,然后(int)2007==(int)0002007

使用PDO时,给它一个字符串,然后在中比较两个字符串和'2007'!='0002007’

3种可能的解决方案(您可以选择一种):

  • 将列publ_nr更改为整数(如果可能,它将不再存储前导0)
  • 确保要查找的值是包含前导0的字符串
  • 在PDO语句中将publ_nr强制转换为整数

  • 两者都给了我预期的结果
    我不相信你,或者至少不相信这个结果。对于我的下一个魔术,我需要一个
    描述publn_数据
    请。您好@fred ii-谢谢您的评论。我在上面的问题中添加了一些额外的信息,并更正了alpha问题。你说得对:应该是EP。你好@Sebas,你说的“需要描述公共数据”是什么意思?你是说描述吗?对不起,我英语不流利。请运行命令
    descripe publn\u data并给出结果。您好@Sebas,谢谢您的帮助。我刚刚用Descripte publn_data的结果编辑了这个问题。亲爱的@thorsten,谢谢你的回答!对我来说,只有选择3是可能的。但是,您能告诉我如何在PDO语句中将publn_nr转换为整数吗?类似于这样:WHERE cast(publ_nr为UNSIGNED)=:nr请注意,此列可以包含字符串。因此,根据DB,“XYZ”是一个非常好的公共资源。如果你把它转换成int,你会得到一个0。
    
    $publnIn = $_POST['publn-in'];
    $publnAuth = substr("$publnIn", 0, 2);
    $publnNr = substr("$publnIn", 2);
    
    Field       Type        Null        Key     Default     Extra
    id          int(10)     YES         MUL     NULL
    publn_auth  char(2)     YES         MUL     NULL
    publn_nr    varchar(15) YES         MUL     NULL
    author      varchar(64) YES         MUL     NULL