【问题标题】:Mysql dynamic sql statement with PDO and parameters带有PDO和参数的Mysql动态sql语句
【发布时间】:2013-02-21 10:16:56
【问题描述】:

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

并且不工作。

【问题讨论】:

  • 旁注,切勿混用数据库库的功能。 mysql_real_escape_string() 不得在 PDO 上下文中使用,因为它依赖于活动的 DB 连接才能正常工作
  • 谢谢。我不知道。

标签: mysql pdo dynamic-sql


【解决方案1】:

我通常做的事情如下:

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

【讨论】:

  • 有趣。我会试试你的方法,然后回来回答。
  • 不要忘记为回滚处理实现 try catch。
  • 我认为我不需要为此选择进行事务处理,但我会添加 try catch,以防 PDO 失败。
【解决方案2】:

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

【讨论】:

  • 参数是用户提交的数据
  • @rhose 然后它变得复杂,因为你必须解析它。您确定需要它们将用户提交的数据传递给字符串吗?与有一个“field_xyz”开关相反,它会导致您的脚本添加 SQL 代码?喜欢迈克尔的节目
  • 我正在构建一个网络服务。我所有的参数都是由用户发送到服务的。我不知道我会得到什么,所以我必须小心。
【解决方案3】:

我通常做的事情如下:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多