查询在MySQL中直接工作或在PHP中使用mysqli,但在PDO中不能

时间:2014-11-29 22:11:11

标签: 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  |
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'];
    }

感谢您解决此问题的任何帮助。

===编辑===

这里有一些额外的细节,来自fred-ii的评论 -

我从发送$ _POST [' publn-in']的表单中获取$ publnAuth和$ publnNr。 在现场,用户通常会写EP0002007或EP2007。 最后,我做了以下事情(有一些解决方法,但我认为这不符合这里的要求):

$publnIn = $_POST['publn-in'];
$publnAuth = substr("$publnIn", 0, 2);
$publnNr = substr("$publnIn", 2);

根据用户的插入情况,它给我们$ publnAuth = EP和$ publnNr = 0002007或2007。

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

publn_auth char(2)和 publn_nr varchar(15)。

==编辑II ==

基于Sebas'评论: 这是我们在"描述publn_data":

之后的信息
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

1 个答案:

答案 0 :(得分:1)

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

当你使用PDO时,你给它一个字符串,然后比较两个字符串和' 2007' !=' 0002007'。

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

  1. 将列publ_nr更改为整数(如果可能,则不再存储前导0)
  2. 确保您要查找的值是字符串incl。领先的0s
  3. 将publ_nr转换为PDO语句中的整数