服务器正在运行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块没有捕获异常。
答案 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中的列(逗号两侧的空格是可以的,但不是必需的)。如果要选择所有列,则只选择*而不包含其他字符。