2011-02-08 26 views
0

服务器运行PHP 5.2.8。 PDO安装了mysql 5.1.30驱动程序。PDO不会从多于1列的SELECT返回结果

好了,所以我试图找出一些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块没有发现异常。

+0

请切换PDO错误无声报告例外。这可能会有所帮助。 – NikiC 2011-02-08 19:57:56

+0

你有错误吗?或者查询只是返回空? – Cfreak 2011-02-08 19:58:33

回答

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()然后执行()。然后,您可以轻松地在prepare()和execute()调用之间插入以下行来处理传递的参数化查询。这将有助于减少SQL注入的机会。

我也改变了你访问retirned价值的方式,通过指定我希望它们返回为和关联数组PDO :: FETCH_ASSOC。这将为您提供一个结果集,您可以像使用旧的mysql接口一样遍历结果集。

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

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

其中:名字是参数。

这里是你将插入在注释中的代码来处理这个问题,(此代码将处理多个参数,只需添加其他元素来$参数数组):

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

请确保您使用逗号分隔SELECT中的列(逗号两边的空格没问题,但不是必需的)。如果你想选择所有列,只有一个*没有其他字符。