将查询从传统MySQL切换到PDO格式

时间:2013-01-17 09:29:14

标签: php mysql pdo

我正在将PHP中所有与mysql相关的内容转换为PDO格式。话虽这么说,我需要问一个问题。

我的查询看起来像这样:

$query = "SELECT COUNT(*) FROM table WHERE home_team = '".$team."' AND home_score > away_score";

使用PDO,我尝试过:

$query = "SELECT COUNT(*) FROM table WHERE home_team=:team AND home_score>:away_score";
$stmt = $db->prepare($query);
$stmt->bindValue(':team', $team, PDO::PARAM_STR);
$count = $stmt->fetchColumn();

然而,当$ count被回显时,什么都没有出现。我有一种强烈的感觉,因为错误与查询有关。但是,我对PDO相当新,并且不能像mysql_query()或die(mysql_error())那样出错!会。

有什么想法吗?

3 个答案:

答案 0 :(得分:1)

您错过了来自通话的错误处理核心。要检查PDO错误:

一个。将PDO错误模式更改为例外:

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

在此之后,PDO错误将导致PDOException实例,您可以捕获/检查。

OR

湾使用errorInfo函数执行查询/ PDO调用后检查错误。

$stmt = $dbh->prepare('bogus sql');
if (!$stmt) {
    echo "\nPDO::errorInfo():\n";
    print_r($dbh->errorInfo());
}

答案 1 :(得分:0)

$query = "SELECT COUNT(*) FROM table WHERE home_team=:team AND home_score>:away_score";
$stmt = $db->prepare($query);
$stmt->execute(array(':team' => $team, ':away_score' => $away_score)); //- you are missing this line
$count = $stmt->fetchColumn();

示例1 here表明应该准备查询而不是先执行查询。之后,您将能够使用fetchColumn获得结果。此外,您似乎缺少一个away_score值。我已经在执行函数

中传递了它

如果客场得分是一列,请不要将其标记为占位符(在其名称前设置:):

$query = "SELECT COUNT(*) FROM table WHERE home_team=:team AND home_score > away_score";

而不是执行:

$stmt->execute(array(':team' => $team));

答案 2 :(得分:0)

在mysql中,我们知道有mysql_fetch_row(),mysql_fetch_array()和mysql_fetch_assoc()。

对于PDO,有很多类型的提取

<?php
// configuration
$dbtype= "mysql";
$dbhost= "localhost";
$dbname= "test";
$dbuser= "root";
$dbpass= "admin";

// database connection
$conn = new PDO("mysql:host=$dbhost;dbname=$dbname",$dbuser,$dbpass);
// query
$sql = "SELECT title FROM books ORDER BY title";
$q   = $conn->query($sql);
// fetch
while($r = $q->fetch()){
  print_r($r);
}
// result
//Array ( [title] => book_title [0] => book_title ) 
?>

这是当您不必准备声明时,如果必须这样做,您应该按照此步骤进行操作

<?php
// configuration
$dbtype= "mysql";
$dbhost= "localhost";
$dbname= "test";
$dbuser= "root";
$dbpass= "admin";

// database connection
$conn = new PDO("mysql:host=$dbhost;dbname=$dbname",$dbuser,$dbpass);
$title = 'PHP AJAX is Awesome';
// query
$sql = "SELECT * FROM books WHERE title = ?";
$q = $conn->prepare($sql);
$q->execute(array($title));
$q->setFetchMode(PDO::FETCH_BOTH);
// fetch
while($r = $q->fetch()){
  print_r($r);
}
?>

最好使用Wild Card 作为属性(因为它类似于ORM系统)

以你的情况为例,你应该这样做

$query = "SELECT COUNT(*) FROM table WHERE home_team=? AND home_score > ?";
$stmt = $db->prepare($query);
$stmt->execute(array($team,$HScore));
$stmt->setFetchMode(PDO::FETCH_BOTH);
$numbers = $stmt->fetch();