0

我正在尝试在 php 和 mysql 中编写一个函数来使用 PDO 从 PHP 和 mysql 中选择值

function getRec($id=0)
{
    ($id==0?$addQuery="":$addQuery=" where id =".$id);
    $statement = $dbh->prepare("select * from TCMS :name order by id");
    $statement->execute(array(':name' => $addQuery));
    $row = $statement->fetchAll(); 
    return $row ;
} 

我有错误

致命错误:未捕获异常 'PDOException' 并带有消息 'SQLSTATE[42000]:语法错误或访问冲突:1064 您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以在 /Applications/XAMPP/xamppfiles/htdoc 中的 '' where id =2' order by id' at line 1' 附近使用正确的语法

实际上我正在尝试什么

如果传递了 ID 的值 (2),则语句将是

select * from TCMS where id=2 order by id

如果 ID=0 则选择语句将是

select * from TCMS order by id

我是 PDO 的新手,不确定确切的语法。

这该怎么做 ?

4

2 回答 2

3

改为这样做:

function getRec($id=0)
{
    //($id==0?$addQuery="":$addQuery=" where id =".$id);
    if ($id == 0)
    {
        $statement = $dbh->prepare("select * from TCMS order by id");
        $statement->execute();
    }
    else
    {
        // Notice the SQL string has changed. Placeholder :name now properly takes the place of a SQL value.
        $statement = $dbh->prepare("select * from TCMS where id = :name order by id");
        $statement->execute(array(':name' => $id));
    }

    $row = $statement->fetchAll(); 
    return $row ;
}

你做错了什么是你试图用占位符绑定和执行 SQL 作为任意字符串值,这不是占位符的用途。

占位符将设置在值的位置(不是表名或其他任何内容),以便在执行期间传入的值将由 PDO 在内部正确处理以进行正确的转义。

我编写的函数应该有助于创建有效的 SQL。

于 2012-11-11T13:23:58.817 回答
2

如果需要动态添加WHERE子句,先构造SQL字符串, 再构造prepare()它。如果满足添加参数的条件,则必须有条件地将适当的占位符/值对添加到传入的数组中execute()

您不能将占位符绑定为任意 SQL 字符串。

// Array to pass into execute()
$values = array();

// Start your SQL...
$sql = "SELECT * FROM TCMS";
// Add the WHERE clause if $id is not zero
if ($id !== 0) {
   $sql .= " WHERE id=:name ";
   // And add the placeholder into the array
   $values[':name'] = $id);
} 
// add the ORDER BY clause
$sql .= " ORDER BY id";

// Prepare the statement
$statement = $dbh->prepare($sql);

$statement->execute($values);
// fetch, etc...
于 2012-11-11T13:24:19.423 回答