2012-07-14 125 views
0

我发现这个http://net.tutsplus.com/tutorials/php/the-problem-with-phps-prepared-statements/PHP/MySQL的:动态准备语句插入/更新查询

和它的作品真的很好有它在一个单独的PHP文件,我的其他文件调用与查询作为参数。

是否有可能使其他查询类似插入和更新?

+0

简短回答是肯定的。看看[这里](http://forum.codecall.net/topic/44392-php-5-mysqli-prepared-statements/) – Zbigniew 2012-07-14 12:40:43

+0

我见过这个教程。它很糟糕(它基于一个错误的假设,你不需要将结果绑定到变量上,你可以使用'$ row [“title”]'etc来做任何你想做的事情 – 2012-07-14 14:35:23

回答

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

所以我必须执行一个select查询然后执行插入查询?我想要一个接受三个参数(两个数组和一个字符串)的方法,第一个可以是值,然后是列和表名,然后该方法应该从这些值开始准备语句查询。虽然我弄不清楚怎么做,但试过一些上面写的代码,但我无法工作 – 2012-07-14 20:00:04

+0

@Oskwish,你应该执行第一个查询来退出表的元数据(把它放在$ fields数组中)然后用$ field数组和$ params(你想要插入的值)构建一个$ ins查询,用这个方法你可以传递第一个参数的值(在这里是$ params),第二个参数列,你不需要,因为你通过第一个查询检索它,并将其放在$ fields数组中,第三个arg桌子,这个你可以通过哟想要的... – 2012-07-14 20:07:00

+0

是啊,不要介意第一个评论。你的代码很好,但我不使用select查询,而是发送列,值和表作为参数。谢谢你的帮助!可以肯定的是,这是插入数据的安全方式,对吧? – 2012-07-14 20:11:37