Bir ekleme sorgusu için mysqli bind_params

1 Cevap php

Ben şöyle call_user_func_array ve mysqli_stmt :: bind_param kullanmaya çalışıyorum:

# A. prepare an insert query statement
$this->_stmt = $db_link->prepare('INSERT INTO foo (col1, col2) VALUES (?,?)');

# B. bind a placeholder array to the statement
$bound = array('col1' => null, 'col2' => null);
call_user_func_array(array($this->_stmt, 'bind_param'), 
  array($types_string, &$bound));

# C. while there are records, retrieve, munge, and insert
while ($row = $res->fetch_assoc()) {
  $bound = transform($row); # $bound remains an array indexed as 'col1', 'col2'
  $this->_stmt->execute();  # PHP Notice:  Array to string conversion
}

Ben dize dönüşüm diziye lider, PHP referanslar karıştı alıyorum. Ya ben adım B altında doğru tutucu dizi bağlayıcı değilim, ya da ben adım C. doğru tutucuya atama değilim

(Benzer sorular daha önce sorulmuş olan, ama benim için bir cevap bulamadım.)

1 Cevap

Sen geçiyoruz

array(
  types,
  &array(
    a, b, c
  )
)

call_user_func_array () ama o olmak zorunda için

array(
  types, &a, &b, &c
)

Bunu başarmak için tek yolu, referans olarak "orijinal" dizinin bütün unsurları ile başka bir (geçici) dizi kullanmaktır. http://docs.php.net/call_user_func_array:

Note: Referenced variables in param_arr are passed to the function by a reference, others are passed by a value. [...]

Örneğin

$mysql = new mysqli('localhost', 'localonly', 'localonly', 'test');
// test table
$mysql->query('CREATE TEMPORARY TABLE foo (a int, b int, c int)') or die($mysql->error);

$params = array('a'=>null, 'b'=>null, 'c'=>null);
$types = 'iii';

$stmt = $mysql->prepare('INSERT INTO foo (a,b,c) VALUES (?,?,?)');
// make an array of references to the original array
$tmp = array($types);
foreach( $params as &$p ) {
  $tmp[] = &$p;
}
call_user_func_array( array($stmt, 'bind_param'), $tmp);

// test insert
for($i=0; $i<10; $i++) {
  $params['a'] = $i;
  $params['b'] = $i+100;
  $params['c'] = $i+1000;
  $stmt->execute();
}
unset($stmt);

// test select
$result = $mysql->query('SELECT * FROM foo');
while( null!==($row=$result->fetch_row()) ) {
  echo join(',', $row), "\n";
}