PDO不会在多于1列的SELECT上返回SELECT的结果

时间:2011-02-08 19:55:25

标签: php mysql pdo

服务器正在运行PHP 5.2.8。 PDO安装了mysql 5.1.30驱动程序。

好吧,所以我想弄清楚一些PDO(这只是让我失望。当我运行下面的代码时,我得到预期的结果,没问题。

但是,每当我尝试向SELECT添加多个列(或*)时,查询都没有回复 - 没有任何结果。我已经尝试了一切 - 我知道它一定很简单。有关为什么多个列无法返回任何行的任何建议?

$hostname = "localhost";
$dbname = "dbname";
$username = "username";
$password = "password";
try {
    $dbh = new PDO("mysql:host=$hostname;dbname=$dbname", $username, $password);
    $dbh->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );
    /*** echo a message saying we have connected ***/
    echo 'Connected to database<br />';

    /*** The SQL SELECT statement ***/
    $sql = "SELECT LastName FROM staff";
    foreach ($dbh->query($sql) as $row) {
        echo $row['LastName'] . '<br />';
    }

    /*** close the database connection ***/
    $dbh = null;
} catch(PDOException $e) {
    echo $e->getMessage();
}

同样,如果我尝试将$ sql中存储的语句中的列添加到单个列以外的任何内容,我会得到bupkis。例如:

SELECT FirstName, LastName FROM staff

返回零结果。两列都存在 - 如果单独请求,它们将返回预期结果。合并后,查询需要相当长的时间,然后不返回任何内容。

catch块没有捕获异常。

2 个答案:

答案 0 :(得分:2)

我认为你在这里遇到了很多问题,主要是在你的代码中处理读取查询返回的值。我冒昧地改变了一些事情并重写它以使用准备语句,这是PDO提供的一个你应该利用的功能。

准备陈述:
为什么要使用它们:http://dev.mysql.com/tech-resources/articles/4.1/prepared-statements.html
PHP PDO doc:http://php.net/manual/en/pdo.prepare.php

以下是核心代码:

try {
  //open database
  $dbh = new PDO("mysql:host=$hostname;dbname=$dbname", $username, $password);  

  $dbh->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );

  //define sql query
  $sql = "SELECT LastName FROM staff";

  //prepare the query for execution 
  $qresult = $dbh->prepare($sql);

  //insert code below to handle parameters to the sql query here

  //execute the query
  $qresult->execute();

  //fetch the results
  foreach ($qresult->fetch(PDO::FETCH_ASSOC) as $row)
    {
    echo $row['LastName'] . '<br />';
    }


} catch (PDOException $e) {
    print "Error!: " . $e->getMessage() . "<br/>";
    die();
}

$qresult = null;  //close the result set
$dbh = null;  //close the database          

注意,我已经用一些调用prepare()然后执行()的行替换了对query()的调用。然后,您可以在prepare()和execute()调用之间轻松插入以下行来处理传递参数化查询。这将有助于减少sql注入的机会。

我还通过指定我希望它们返回为关联数组PDO :: FETCH_ASSOC来改变您访问retirned值的方式。这将为您提供一个结果集,您可以像使用旧的mysql接口一样进行迭代。

如果您的查询是参数化查询,例如:

$sql="SELECT LastName FROM staff WHERE LastName=':lastname'";

其中:lastname是参数。

以下是您将在注释中插入的代码来处理此问题(此代码将处理多个参数。只需在$ param数组中添加其他元素):

//bind parameters to the prepared statement
$param = array(':lastname'=>'Jones');
foreach ($param as $key => $value) {
  $qresult->bindValue($key,$value);
  }

答案 1 :(得分:0)

确保用逗号分隔SELECT中的列(逗号两侧的空格是可以的,但不是必需的)。如果要选择所有列,则只选择*而不包含其他字符。