0

我想创建一个动态 sql 语句并使用 PDO 运行它。我的问题是我有一些参数,我想不出一种传递参数的方法。前任 :

$query = "Select * from tbl_task where 1=1";
if (!empty($name)) $query .= " AND name = ?";
if (!empty($status)) $query .= " AND status = ?"
$db_stmt = new PDOStatement();
$db_stmt = $this->db->prepare($query);
$db_stmt->bindParam (1,$name); 
$db_stmt->bindParam (2,$status);

我的参数没有被绑定,我不知道我必须绑定多少个参数,除非我编写相同的 if 语句但使用 bindParam 指令。

mysql_real_escape_string尝试将 bindParam 改为 PDO,但由于某种原因,我的参数被添加为空。

关于如何构建动态查询并将参数绑定到 PDO 的任何想法?

编辑 1:

$arr = array();
if (!empty($name)){
    $query .= " AND `name` like :NAME";
    $arr['NAME'] = $name;
}
$db_stmt = new PDOStatement();
$db_stmt = $this->db->prepare($query);
$db_stmt->execute($arr);

我怎样才能写一个“喜欢”的声明?我试过

$query .= " AND `name` like :NAME" . "%";

并且不工作。

4

3 回答 3

2

我通常做的事情如下:

$query = "Select * from `tbl_task` where 1=1";
$arr = array();
if (!empty($name)) 
    {
    $query .= " AND `name` = :NAME";
    $arr['NAME'] = $name;
    }
if (!empty($status))
    {
    $query .= " AND `status` = :STATUS";
    $arr['STATUS'] = $status;
    }
$this->db->beginTransaction();
try
    {  
    $tmp = $this->db->prepare($query);  
    $tmp->execute($arr);
    $this->db->commit();
    }
catch(PDOException $ex)
    {
    $this->db->rollBack();
    $this->log->error($ex->getMessage());
    }
于 2013-02-21T10:26:50.600 回答
1

不能添加 SQL 代码作为参数;只有数据会做。您必须将这些位强制放入$query. 它们不会被转义,因此它们不应该包含用户提交的数据。

于 2013-02-21T10:26:57.593 回答
0

我通常做的事情如下:

$query = "Select * from tbl_task where 1=1";
if (!empty($name)) $query .= $db->parse(" AND name = ?s", $name);
if (!empty($status)) $query .= $db->parse(" AND status = ?s",$status);
$data = $this->db->getAll($query);

这个想法是有一个函数来解析任意查询部分而不是整个查询中的占位符。
不过,我不打扰本地准备好的语句。他们用大量无用的代码污染了 PHP 脚本,没有任何好处。

要回答
您被告知的更新问题,您不能绑定任意查询部分。但只是字面意思。
所以,让你的文字看起来像foo% ,然后用通常的方式绑定它。

于 2013-02-21T10:34:13.807 回答