php mysqli 預先處理 怎麼綁定參數
/**
* php中預先處理執行sql
* $sql[String]sql語句
* $args[array]參數
*/
public function exeSql($sql,$args){
$mysqli_stmt=$mysqli->prepare($sql);
//由於$sql由調用者傳入,所以sql語句和參數個數都不確定
//疑問1:怎麼擷取參數類型呢?php中有沒有相應的函數呢?
//如果沒有我用如下方法:getParamTypeStr($arr)是否可行呢?有什麼好的建議嗎?
//疑問2:怎麼綁定參數呢?如下為參數個數確定時的Binder 方法。
//$mysqli_stmt->bind_param("ssi","xx","xx",20);
$mysqli_stmt->execute();
$mysqli->close();
}
private function getParamTypeStr($arr){
$count = count($arr);
$typestr = "";
for($i = 0; $i<$count; $i++){
$type = gettype($arr[$i]);
switch($type){
case "integer":
$typestr.= "i";
break;
case "float":
case "double":
$typestr.= "d";
break;
case "string":
$typestr.= "s";
break;
}
}
return $typestr;
}
我知道java中是通過如下方式實現的:
//java中預先處理執行sql
public void exeSql(String sql,Object[] args){
PreparedStatement preparedStatement = connection.prepareStatement(sql);
for(int i =0;i preparedStatement.setObject(i+1, args[i]);
}
preparedStatement.executeUpdate();
connection.close();
}
哪位朋友幫忙解答下上面2點疑問,本人剛轉php,看了文檔,中有提及反射,不是很懂,也有朋友說通過替換sql中的'?',還望朋友詳細指點,最好能提供點核心代碼。非常感謝!
------解決方案--------------------
2.
$callback = array($mysqli_stmt, 'bind_param');
// 將參數類型描述加入數組
array_unshift($args, getParamTypeStr($args));
call_user_func_array($callback, $args);
// 它的調用類似:
$mysqli_stmt->bind_param(getParamTypeStr($args), $args[0], $args[1], $args[2] ...);
推薦你用PDO,mysqli的這個功能挺不好用的,PDO的bindParam()方法要直觀的多
http://www.php.net/manual/en/pdostatement.bindparam.php
------解決方案--------------------
我這裡有一個我自己寫的PHP的PDO類,你可以直接用:
/* 串連資料庫類 MysqlConnect */
class MysqlConnect{
private $dbhost=null;
private $dbuser=null;
private $dbpwd=null;
private $dbname=null;
private $dbport=null;
private $ifpdo=null;
private $dburi=null;
private $handler=null;
function __construct($dbhost,$dbuser,$dbpwd,$dbname,$dbport,$ifpdo,$dburi){
$this->dbhost=$dbhost;
$this->dbuser=$dbuser;
$this->dbpwd=$dbpwd;
$this->dbname=$dbname;
$this->dbport=$dbport;
$this->ifpdo=$ifpdo;
$this->dburi=$dburi;//PDO的URI參數,可以查手冊
if($this->ifpdo==1){//表示調用PDO來操作資料庫
$this->handler=$this->CreatePdo();
}elseif($this->ifpdo==0){//這裡可以寫MYSQLI的方法
$this->handler=null;
}
}
/* ----------------這裡是入口--------------------- */
[email protected] sql:外部調用時傳遞的完整SQL語句
[email protected] bindArray:綁定的參數數組,與sql語句有關,如果沒有PDO預留位置此處為空白
[email protected] action:傳遞巨集指令引數,"select"/"update"/"delete"/"insert"
public function exeSql($sql,$bindArray=array(),$action=""){