【问题标题】:PHP/MySQL: Dynamic prepared statement with insert/update queryPHP/MySQL:带有插入/更新查询的动态准备语句
【发布时间】:2012-07-14 02:09:43
【问题描述】:

我找到了这个http://net.tutsplus.com/tutorials/php/the-problem-with-phps-prepared-statements/

并且将它放在一个单独的 php 文件中非常好,我的其他文件使用查询作为参数调用该文件。

是否可以与其他查询(如插入和更新)进行类似的操作?

【问题讨论】:

  • 简短的回答是肯定的。看看here
  • 我看过教程。这很糟糕(它基于错误的假设,您不需要将结果绑定到变量。您可以使用$row["title"] 等做任何您想做的事情。

标签: php mysql dynamic


【解决方案1】:

这是更新后的示例:

$params 是一个数组。

 function insertToDB($params, $db) { //Pass array and db

        $fields = array();
        $conn = new mysqli('localhost', 'root', 'root', 'db') or die('XXX');     
        $stmt =  $conn->stmt_init();
        $stmt->prepare("SELECT * FROM ".$db); 
        $stmt->execute();
        $meta =  $stmt->result_metadata();
        while ($field = $meta->fetch_field()) { 
             $fields[] = $field->name;   
        }

        $fields = implode(", ", $fields);


        $placeholders = implode(',', array_fill(0, count($params), '?'));

        $types = '';
        foreach($params as $value) {
            $types.= substr(strtolower(gettype($value)), 0, 1); 
        }

        $ins = "INSERT INTO MYDB (".$fields.") VALUES (".$placeholders.")"; 

        $bind_names[] = $types; 
        for ($i = 0; $i < count($params); $i++) { 
            $bind_name = 'bind' . $i;
            $$bind_name = $params[$i];
            $bind_names[] = &$$bind_name;
        }
        if ($stmt->prepare($ins)) {
                call_user_func_array(array($stmt,'bind_param'),$bind_names); 
                $insresult = $stmt->execute(); 
        }
        return $insresult;
        $stmt->close();
    }

【讨论】:

  • 所以我必须执行一个选择查询然后执行一个插入查询?我想要一种采用三个参数(2 个数组和一个字符串)的方法。第一个可以是值,然后是列,最后是表名。然后该方法应该从这些值中进行准备好的语句查询。虽然我不知道怎么做。尝试了您在上面编写的一些代码,但我无法使其正常工作。
  • @Oskwish,您应该执行第一个查询以检索表的元数据(将其放在 $fields 数组中),然后使用 $field 数组和 $params 构建一个 $ins 查询(一个要插入的值数组)。使用此方法,您可以传递第一个参数值(在本例中为 $params),第二个参数为列,您不需要,因为您通过第一个查询检索它并将其放入 $fields 数组,第三个参数为表,您可以通过你想要的......
  • 是的,不要介意第一条评论。您的代码运行良好,尽管我不使用选择查询,而是将列、值和表作为参数发送。谢谢你的帮助!可以肯定的是,这是一种安全的数据插入方式,对吧?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-19
  • 1970-01-01
  • 2015-10-12
相关资源
最近更新 更多