带有PDO和参数的mysql动态sql语句

时间:2013-02-21 10:16:57

标签: mysql pdo dynamic-sql

我想创建一个动态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);

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

我尝试使用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" . "%";

并且无法正常工作。

3 个答案:

答案 0 :(得分: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());
    }

答案 1 :(得分:1)

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

答案 2 :(得分: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%然后以常规的方式绑定它。