Đây là những gì tôi sử dụng để làm mysqli chuẩn bị báo cáo với một số lượng biến của params. Đó là một phần của một lớp tôi đã viết. Nó có thể vượt trội cho những gì bạn cần nhưng nó sẽ cho bạn thấy đúng hướng.
public function __construct($con, $query){
$this->con = $con;
$this->query = $query;
parent::__construct($con, $query);
//We check for errors:
if($this->con->error) throw new Exception($this->con->error);
}
protected static $allowed = array('d', 'i', 's', 'b'); //allowed types
protected static function mysqliContentType($value) {
if(is_string($value)) $type = 's';
elseif(is_float($value)) $type = 'd';
elseif(is_int($value)) $type = 'i';
else throw new Exception("type of '$value' is not string, int or float");
return $type;
}
//This function checks if a given string is an allowed mysqli content type for prepared statement (s, d, b, or i)
protected static function mysqliAllowedContentType($s){
return in_array($s, self::$allowed);
}
public function feed($params){
//These should all be empty in case this gets used multiple times
$this->paramArgs = array();
$this->typestring = '';
$this->params = $params;
$this->paramArgs[0] = '';
$i = 0;
foreach($this->params as $value){
//We check the type:
if(is_array($value)){
$temp = array_keys($value);
$type = $temp[0];
$this->params[$i] = $value[$type];
if(!self::mysqliAllowedContentType($type)){
$type = self::mysqliContentType($value[$type]);
}
}
else{
$type = self::mysqliContentType($value);
}
$this->typestring .= $type;
//We build the array of values we pass to the bind_params function
//We add a refrence to the value of the array to the array we will pass to the call_user_func_array function. Thus say we have the following
//$this->params array:
//$this->params[0] = 'foo';
//$this->params[1] = 4;
//$this->paramArgs will become:
//$this->paramArgs[0] = 'si'; //Typestring
//$this->paramArgs[1] = &$this->params[0];
//$this->paramArgs[2] = &$this->params[1].
//Thus using call_user_func_array will call $this->bind_param() (which is inherented from the mysqli_stmt class) like this:
//$this->bind_param('si', &$this->params[0], &$this->params[1]);
$this->paramArgs[] = &$this->params[$i];
$i++;
}
unset($i);
$this->paramArgs[0] = $this->typestring;
return call_user_func_array(array(&$this, 'bind_param'), $this->paramArgs);
}
Bạn sử dụng nó như thế này:
$prep = new theClassAboveHere($mysqli, $query);
$prep->feed(array('string', 1, array('b', 'BLOB DATA'));
Lớp nên mở rộng các lớp mysqli_stmt.
Tôi hy vọng điều này sẽ giúp bạn đi đúng hướng.
Nếu bạn không thể đăng cả lớp, nó bao gồm các kết quả khác nhau.
Nguồn
2009-04-27 13:38:12
@altCongnito does 'array_insert() 'thực sự tồn tại? –
Bạn đã viết '$ sql + =' thay vì '$ sql. =' – pmrotule