2

MySQLi を使用しているスクリプトを編集しています。データベースにいくつかの値を挿入するには、準備されたステートメントを使用する必要があります。

私の配列は次の形式です。

$insert = array('column1' => 'value1', 'column2' => 'value2', 'column3' => 'value3')

私はこれまでのところこれを持っていますが、そのbind_param部分について助けが必要です. ここでcall_user_func_arrayが使用されているドキュメントを見てきましたが、これを実装する方法がわかりません。

$cols = array_keys($insert);
$query = "INSERT IGNORE INTO results (". implode(", ", $cols) .") VALUES (". implode(', ', array_fill(0, count($insert), '?')) .")";
$stmt = $mysqli->prepare($query);
$param = array_merge(array(str_repeat('s', count($insert))), array_values($insert)); 
call_user_func_array(array($stmt, 'bind_param'), $param); 
$stmt->execute();

PHP 5.4.17

4

3 に答える 3

6

いいえ... mysqli_stmt_bind_param()がどのように機能するかにより、これはどの配列でも PDO よりも間違いなく困難でした...そして、これ$arrayは他の列のデータの削除/追加に変更することでうまく機能します。

$mysqli = new mysqli('localhost', 'root', 'password', 'test');

$array  = array("name"=>"pineapple", "color"=>"purple"); 

$table_name = "fruit"; 



insert_data($mysqli, $array, $table_name);



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

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

   $query = "insert into $table_name ".
            '('.implode(', ', $keys).') values '.
            '('.implode(', ', $placeholders).'); '; 
   // insert into fruit (name, color) values (?, ?);    

   $stmt = $mysqli->prepare($query);

   // create a by reference array... 
   $params = array(); 
   foreach ($array as &$value) { 
      $params[] = &$value;
   }
   $types  = array(str_repeat('s', count($params))); 
   $values = array_merge($types, $params); 

   /*           
   $values = Array
      (
          [0] => ss
          [1] => pineapple
          [2] => purple
      ) 
   */

   call_user_func_array(array($stmt, 'bind_param'), $values); 

   $success = $stmt->execute();

   if ($success) { print "it worked..."; } 
           else { print "it did not work..."; }
}  

私はこれらのSO投稿からいくつかの助けを得ました:
- https://stackoverflow.com/a/15933696/623952
- https://stackoverflow.com/a/6179049/623952


そのため...$stmt->bind_param()最初のパラメーターは、渡されたパラメーターごとに1つの文字を持つ文字列です。その文字は、パラメーターのデータ型を表します。上記の例では、2 つのパラメーターの両方が文字列であるため、 になりssます。上記の例でも、常に文字列が想定されています。

bind_param()ドキュメントでこのチャートを見つけました:

対応するバインド変数の型
を指定する 1 つ以上の文字を含む文字列:

Type specification chars  

Character    Description  
i            corresponding variable has type integer
d            corresponding variable has type double
s            corresponding variable has type string
b            corresponding variable is a blob and will be sent in packets
于 2013-10-29T18:26:37.827 に答える
0

bind_param で配列を挿入するのは面倒なので、php の filter_var 関数を使用することをお勧めします。同じフィルタリングを行い、変数、入力、その完璧な検証も行います。関数のマニュアルページ

于 2016-01-09T18:38:17.640 に答える