sql >> Databáze >  >> RDS >> Mysql

PHP - MySQL připravilo příkaz pro INSERT pole

Ne... to bylo rozhodně těžší než PDO s jakýmkoli polem, protože mysqli_stmt_bind_param() funguje... a funguje to dobře změnou $array k odstranění/přidání dat pro další sloupce.

$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..."; }
}  

Pomohly mi tyto příspěvky SO:
- https://stackoverflow.com/a /15933696/623952
- https://stackoverflow.com/a/6179049/623952

Takže... v $stmt->bind_param() první parametr je řetězec, který má jeden znak pro každý předaný parametr. A tento znak představuje datový typ parametru. Ve výše uvedeném příkladu jsou oba dva parametry řetězce, takže se změní na ss . Řetězec se vždy předpokládá i ve výše uvedeném příkladu.

Tento graf jsem našel v bind_param() dokumentace:

typy
Řetězec, který obsahuje jeden nebo více znaků, které určují typy pro odpovídající proměnné vazby:

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. Chyba Delphi XE5 FireDAC:Nelze načíst knihovnu dodavatele [libmysql.dll nebo libmysqld.dll]

  2. Proč je UDF mnohem pomalejší než poddotaz?

  3. CURRENT_DATE/CURDATE() nefunguje jako výchozí hodnota DATE

  4. Mysql rekurze?