sql >> データベース >  >> RDS >> Mysql

PHP-配列を挿入するためのMySQLプリペアドステートメント

    いいえ...これは、 mysqli_stmt_bind_param() 動作します...これは$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つのcharを持つ文字列です。そして、そのcharはパラメーターのデータ型を表します。上記の例では、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
    


    1. プリペアドステートメントのパラメータにデータが提供されていません

    2. SQL Serverのvarbinary(max)の最大実スペース

    3. PostgreSQL:実行中のクエリ並列処理

    4. WITH句を使用したクエリでPostgresにFROM句のエントリエラーがありません