php mysqli 預先處理 如何綁定參數

來源:互聯網
上載者:User
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=""){
  • 聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.