2013-02-21 76 views
0

我想创建一个动态的SQL语句并使用PDO运行它。我的问题是,我有一些参数,我想不出一种方式来传递参数。 例如:Mysql动态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" . "%"; 

并且不工作。

+0

注意,不要混合数据库库的功能。 'mysql_real_escape_string()'不能用在PDO上下文中,因为它依赖于活动的数据库连接正常工作 – 2013-02-21 10:28:10

+0

谢谢。我不知道。 – 2013-02-22 06:48:51

回答

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()); 
    } 
+0

有趣。我会尝试你的方式,并回来一个asnwer。 – 2013-02-21 10:29:04

+0

不要忘记为回滚处理实现try catch。 – Tschallacka 2013-02-21 10:29:23

+0

我不认为我需要这个选择的交易,但我会添加try catch,以防PDO失败。 – 2013-02-21 10:32:57

1

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

+0

参数是用户提交的数据 – 2013-02-21 10:27:56

+0

@rhose然后它变得复杂,因为你必须解析它。你确定你需要他们将用户提交的数据传递给字符串吗?而不是有一个“field_xyz”开关,然后导致您的脚本添加SQL代码?像迈克尔显示 – 2013-02-21 10:29:09

+0

我正在构建一个web服务。我所有的参数都是由用户发送给服务的。我不知道我会得到什么,所以我必须小心。 – 2013-02-21 10:30:14

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%然后绑定它通常的方式。