2011-05-30 166 views
0

我有一个函数做一个简单的插入,但我试图通过传递一个数组使得该方法更健壮。 这就是我数组传递到它:PHP准备好的语句与数组

 $form_data = array(
     "sort_order"=>$_POST['sort_order'], 
     "name"=>$_POST['page_name'], 
     "text"=>$_POST['page_text'], 
     "image"=>$_POST['page_image'], 
     "meta_desc"=>$_POST['meta_desc'], 
     "meta_kw"=>$_POST['meta_kw'], 
     "meta_author"=>$_POST['meta_author'], 
     "image_thumb"=>"NULL", 
    ); 

这里是功能代码:

public function insert_data($array){ 
     $keys = array(); 
     $values = array(); 

     foreach($array as $k => $v){ 
      $keys[] = $k; 
      if(!empty($v)){ 
       $values[] = $v; 
      } else { 
       $values[] = "NULL"; 
      } 
     } 

     $stmt = self::$mysqli->stmt_init(); 
     $query = "INSERT INTO `".DB_TABLE_PAGES."` (".implode(",",$keys).") VALUES (?,?,?,?,?,?,?,?)"; 


     $stmt->prepare($query); 
     $stmt->bind_param('ssssssss',implode(",",$values)); 

     //$stmt->execute(); 
    } 

,但我得到这个错误: 在类型定义字符串元素不匹配数数绑定变量。

我知道问题是什么,但我不明白我如何实现它。

我用Google搜索和整个这个线程传来:

link to thread

可以在任何一个可以帮助我苏斯这一点?

千恩万谢

+0

什么是'$ query'的价值? – 2011-05-30 17:00:57

+0

你的意思是我传入函数来构建查询的数组? – Adamski 2011-05-30 17:03:43

+0

$ query在使用前定义了1行。 – Evert 2011-05-30 17:04:11

回答

3

试试这个:

public function insert_data($array){ 
    $placeholders = array_fill(0, count($array), '?'); 

    $keys = $values = array(); 
    foreach($array as $k => $v) { 
     $keys[] = $k; 
     $values[] = !empty($v) ? $v : null; 
    } 

    $stmt = self::$mysqli->stmt_init(); 
    $query = 'INSERT INTO `'.DB_TABLE_PAGES.'` '. 
      '('.implode(',', $keys).') VALUES '. 
      '('.implode(',', $placeholders).')'; 
    $stmt->prepare($query); 

    call_user_func_array(
     array($stmt, 'bind_param'), 
     array_merge(
      array(str_repeat('s', count($values))), 
      $values 
     ) 
    ); 

    $stmt->execute(); 
} 

或者更好的是,使用PDO来代替:

public function insert_data($array){ 
    $placeholders = array_fill(0, count($array), '?'); 

    $keys = $values = array(); 
    foreach($array as $k => $v){ 
     $keys[] = $k; 
     $values[] = !empty($v) ? $v : null; 
    } 

    // assuming the PDO instance is $pdo 
    $query = 'INSERT INTO `'.DB_TABLE_PAGES.'` '. 
      '('.implode(',', $keys).') VALUES '. 
      '('.implode(',', $placeholders).')'; 
    $stmt = $pdo->prepare($query); 

    $stmt->execute($values); 
} 

注:我用的null不变,因为"NULL"字符串将被转义为一个字符串(而不是空值)。

+0

对伴侣,欢呼声,PDO一路砰砰响:-) – Adamski 2011-05-30 18:11:21

+0

为什么你将空值赋给NULL?如果我的数据中有一个零,我想插入一个零,而不是null。 – 2013-06-29 07:38:20

0

相反bind_param的(这在我的脑海中始终是混淆了),只是做:

$stmt->execute($values); 

还可以获得通过使用array_keys()和array_values摆脱你的循环()

+0

它给了我这个错误:mysqli_stmt :: execute()期望完全0参数,给出1。谢谢你对数组函数的提示:-) – Adamski 2011-05-30 17:07:39

+0

出于某种原因,我认为你使用PDO,这是可能的。我非常惊讶MySQLi没有一次性传递所有参数的功能,但我似乎无法在文档中找到它。在这种情况下,您需要分别绑定所有参数。 – Evert 2011-05-30 17:19:19

0

虽然这是一个古老的问题,但它已经出现在我的几个搜索中,以找到同样问题的雄辩答案。经过多次搜索,以及@netcoder提供的解决方案的实现后,我发现了一些更简洁的内容。

声明,这是使用拆包(图示)运算符PHP 5.6:

public function genericQueryWithParams($query, $params, $types) 
{ 
    $db = new mysqli('localhost','username','password','schema'); 

    if($sql = $db->prepare($query)) 
    { 
     $sql->bind_param($types, ...$params); 
     $sql->execute(); 
     return $sql->get_result(); 
    } 
}