我正在尝试在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的新手,不确定语法是否合适。
怎么做?
答案 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...