再使用php進行原生框架搭建的過程當中,發現即便sql語句錯誤,php的pdo是不會報錯的,很是奇怪php
而後研究了下,發現原來pdo默認是不報錯的,想要報錯就要知足兩個條件:mysql
一、須要將錯誤處理模式變成異常模式sql
$pdo->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);數據庫
二、全部可能出錯的語句都必須進行捕捉數組
try{服務器
//code框架
}catch(PDOExecption $e){fetch
//錯誤信息處理spa
}code
總結:
pdo使用:
$pdo=new PDO("mysql:host=localhost;dbname=kong","root",""); $pdo->query();//執行的是select語句,返回值是PDOStatement對象。 $pdo->fetchAll(PDO::FETCH_ASSOC);//經過一次調用返回所有結果,並以數組方式保存 $pdo->exec();//執行的是返回值爲intl的sql語句:增長,修改,刪除 $pdo->exective();//執行的是預處理語句 /*設置字符集 */ $pdo->query("set names utf8");
另外,在使用pdo返回數據的時候,若是不設置,返回的數據會出現問題。如明明是int類型,返回的確實string
解決:
$options = [ PDO::ATTR_EMULATE_PREPARES => false, PDO::ATTR_STRINGIFY_FETCHES => false ]; static::$pdo = new PDO("mysql:host=$host;dbname=$database", $username, $password, $options);
PDO::ATTR_STRINGIFY_FETCHES: 提取的時候將數值轉換爲字符串。 須要 bool 類型。
PDO::ATTR_EMULATE_PREPARES 啓用或禁用預處理語句的模擬。 有些驅動不支持或有限度地支持本地預處理。使用此設置強制PDO老是模擬預處理語句(若是爲 TRUE ),或試着使用本地預處理語句(若是爲 FALSE)。若是驅動不能成功預處理當前查詢,它將老是回到模擬預處理語句上。 須要 bool 類型。
注意:修改完,若發現還不起做用,是由於你用的是老的驅動php5-mysql,你應該換成php5-mysqlnd。
經常使用屬性及使用方式:
設置PDO在處理數據過程當中的處理方式:
PDO::setAttribute:設置屬性
PDO::getAttribute:獲取屬性
PDO::ATTR_CASE:當pdo從結果集中獲取數據的時候,如何處理對應的字段的名字
PDO::CASE_LOWER:將全部字段都小寫顯示
PDO::CASE_UPPER:全部字段都大寫顯示
PDO::CASE_NATURAL:本來怎麼樣就怎麼樣
$pdo->setAttribute(PDO::ATTR_CASE,PDO::CASE_NATURAL); //或 $pdo->setAttribute(PDO::ATTR_CASE,1); var_dump(PDO::CASE_UPPER); //1 轉換爲大寫 var_dump(PDO::CASE_LOWER); //2 轉換爲小寫 var_dump(PDO::CASE_NATURAL); //0 是怎樣就是怎樣 $sql = "select * from user "; $stmt = $pdo->query($sql); var_dump($stmt->fetch(PDO::FETCH_ASSOC));
PDO::ATTR_AUTOCOMMIT:設置當前鏈接Mysql服務器的客戶端的SQL語句是否自動執行,默認是自動提交
//自動提交屬性 var_dump($pdo->getAttribute(PDO::ATTR_AUTOCOMMIT)); //1 $pdo->setAttribute(PDO::ATTR_AUTOCOMMIT,0); var_dump($pdo->getAttribute(PDO::ATTR_AUTOCOMMIT)); //0
PDO::ATTR_ERRMODE:錯誤模式,當pdo出現錯誤的時候到底使用哪一種模式進行處理,會內部本身拋出異常,終斷頁面
PDO::ERRMODE_SILENT:靜默模式,默認的出錯了無論
PDO::ERRMODE_WARNING:警告模式,若是出錯了就會報出警告
PDO::ERRMODE_EXCEPTION:異常模式,若是出錯會採用異常來處理(PDOException)
var_dump($pdo->getAttribute(PDO::ATTR_ERRMODE)); var_dump(PDO::ERRMODE_SILENT); //0 靜默模式,默認的出錯了無論 var_dump(PDO::ERRMODE_WARNING); //1 警告模式,若是出錯了就會報出警告 var_dump(PDO::ERRMODE_EXCEPTION); //2 異常模式,若是出錯會採用異常來處理(PDOException)
PDO::ATTR_PERSISTENT:當前對Mysql服務器的鏈接是不是長鏈接
TRUE:是長鏈接(長鏈接的使用必需要配合:Apache(connection:keepAlive),Mysqld)
FALSE:默認的,非長鏈接
什麼狀況下使用長鏈接?