选择使用php mysql使用PDO中的位置

时间:2012-11-11 13:16:44

标签: php mysql pdo

我正在尝试在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服务器版本在''id = 2'附近使用   在/ Applications / XAMPP / xamppfiles / htdoc

中按id'在第1行排序

实际上我正在尝试

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

select * from TCMS where id=2 order by id

如果ID = 0,那么select语句将是

select * from TCMS order by id

我是PDO的新手,不确定语法是否合适。

怎么做?

2 个答案:

答案 0 :(得分: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。

答案 1 :(得分: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...