本文目錄一覽:
使用pdo連接mysql資料庫
看看是否支持pdo,因為默認的錯誤如果不顯示的話,就靠返回錯誤只能得到這個,pdo還是需要pdo_mysql來支持的。
php連接mysql資料庫原理是怎樣的
現在使用PDO鏈接資料庫的較多
連接是通過創建 PDO 基類的實例而建立的。不管使用哪種驅動程序,都是用 PDO 類名。構造函數接收用於指定資料庫源(所謂的 DSN)以及可能還包括用戶名和密碼(如果有的話)的參數。
連接到 MySQL
?php
$dbh = new PDO(‘mysql:host=localhost;dbname=test’, $user, $pass);
?
如果有任何連接錯誤,將拋出一個 PDOException 異常對象。如果想處理錯誤狀態,可以捕獲異常,或者選擇留給通過 set_exception_handler() 設置的應用程序全局異常處理程序。
處理連接錯誤
?php
try {
$dbh = new PDO(‘mysql:host=localhost;dbname=test’, $user, $pass);
foreach($dbh-query(‘SELECT * from FOO’) as $row) {
print_r($row);
}
$dbh = null;
} catch (PDOException $e) {
print “Error!: ” . $e-getMessage() . “br/”;
die();
}
?
如果應用程序不在 PDO 構造函數中捕獲異常,zend 引擎採取的默認動作是結束腳本並顯示一個回溯跟蹤,此回溯跟蹤可能泄漏完整的資料庫連接細節,包括用戶名和密碼。因此有責任去顯式(通過 catch 語句)或隱式(通過 set_exception_handler() )地捕獲異常。
連接數據成功後,返回一個 PDO 類的實例給腳本,此連接在 PDO 對象的生存周期中保持活動。要想關閉連接,需要銷毀對象以確保所有剩餘到它的引用都被刪除,可以賦一個 NULL 值給對象變數。如果不明確地這麼做,PHP 在腳本結束時會自動關閉連接。
關閉一個連接
?php
$dbh = new PDO(‘mysql:host=localhost;dbname=test’, $user, $pass);
// 在此使用連接
// 現在運行完成,在此關閉連接
$dbh = null;
?
很多 web 應用程序通過使用到資料庫服務的持久連接獲得好處。持久連接在腳本結束後不會被關閉,且被緩存,當另一個使用相同憑證的腳本連接請求時被重用。持久連接緩存可以避免每次腳本需要與資料庫回話時建立一個新連接的開銷,從而讓 web 應用程序更快。
PHP怎麼連接MySQL
PHP連接mysql資料庫是PHP新手們必須要掌握的一項技能,只要掌握了PHP對資料庫進行增刪改查等操作,就可以寫出一些簡單且常見的程序。如留言表,新聞頁等。本篇文章主要給大家詳細介紹PHP連接Mysql資料庫的兩種常用方法。
下面我們通過具體的代碼示例來給大家詳細介紹兩種PHP連接mysql資料庫的方法。
mysqli連接資料庫和pdo連接資料庫。
第一種方法:使用mysqli連接mysql資料庫
代碼實例如下:
?php
$host=’127.0.0.1′;
$user=’root’;
$password=’root’;
$dbName=’php’;
$link=new mysqli($host,$user,$password,$dbName);
if ($link-connect_error){
die(”連接失敗:”.$link-connect_error);
}
$sql=”select * from admins”;
$res=$link-query($sql);
$data=$res-fetch_all();
var_dump($data);
在經過一系列的連接操作後,我們再創建一個sql語句對其中數據表進行查詢檢驗。在上述代碼中,我們要先創建一些需要用到的變數,如資料庫用戶名、資料庫名密碼等。然後我們用面向對象的方式連接了名為php的資料庫。再通過if條件語句,connect-error方法判斷PHP連接資料庫是否成功。
這裡我們先登錄phpmyadmin看看是否存在php資料庫,從下圖可以知道是存在php這個資料庫的。
最後通過瀏覽器訪問,結果如下圖:
從圖中可以得知,我們成功地連接了php資料庫,並且能查詢出數據表信息。
第二種方法:使用PDO連接資料庫
代碼示例如下:
?php
$host=’127.0.0.1′;
$user=’root’;
$password=’root’;
$dbName=’php’;
$pdo=new PDO(”mysql:host=$host;dbname=$dbName”,$user,$password);
$sql=”select * from admins”;
$data=$pdo-query($sql)-fetch();
var_dump($data);
PHP連接Mysql步驟以上就是關於PHP連接資料庫查詢數據的兩種常用方法詳解,更多相關教程請訪問php中文網mysql視頻教程,歡迎參考學習
如何使用PDO查詢Mysql來避免SQL注入風險
我把問題和贊同最多的答題翻譯了下來。提問:如果用戶的輸入能直接插入到SQL語句中,那麼這個應用就易收到SQL注入的攻擊,舉個例子:$unsafe_variable = $_POST[‘user_input’]; mysqli_query(“INSERT INTO table (column) VALUES (‘” . $unsafe_variable . “‘)”);用戶可以輸入諸如 : value’); DROP TABLE table;– ,SQL語句就變成這樣了:INSERT INTO table (column) VALUES(‘value’); DROP TABLE table;–‘)(譯者註:這樣做的結果就是把table表給刪掉了) 我們可以做什麼去阻止這種情況呢?回答:使用prepared statements(預處理語句)和參數化的查詢。這些SQL語句被發送到資料庫伺服器,它的參數全都會被單獨解析。使用這種方式,攻擊者想注入惡意的SQL是不可能的。要實現這個主要有兩種方式:1. 使用 PDO:$stmt = $pdo-prepare(‘SELECT * FROM employees WHERE name = :name’); $stmt-execute(array(‘:name’ = $name)); foreach ($stmt as $row) { // do something with $row }2. 使用 Mysqli:$stmt = $dbConnection-prepare(‘SELECT * FROM employees WHERE name = ?’); $stmt-bind_param(‘s’, $name); $stmt-execute(); $result = $stmt-get_result(); while ($row = $result-fetch_assoc()) { // do something with $row }PDO需要注意的是使用PDO去訪問MySQL資料庫時,真正的prepared statements默認情況下是不使用的。為了解決這個問題,你需要禁用模擬的prepared statements。下面是使用PDO創建一個連接的例子:$dbConnection = new PDO(‘mysql:dbname=dbtest;host=127.0.0.1;charset=utf8’, ‘user’, ‘pass’); $dbConnection-setAttribute(PDO::ATTR_EMULATE_PREPARES, false); $dbConnection-setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);上面的例子中,錯誤報告模式並不是強制和必須的,但建議你還是添加它。通過這種方式,腳本在出問題的時候不會被一個致命錯誤終止,而是拋出PDO Exceptions,這就給了開發者機會去捕獲這個錯誤。然而第一行的 setAttribute() 是強制性的,它使得PDO禁用模擬的prepared statements並使用真正的prepared statements。這可以確保這些語句和值在被發送到MySQL伺服器之前不會被PHP解析(這使得攻擊者沒有注入惡意SQL的機會)。儘管你可以使用可選的構造函數參數去設置 charset ,但重點需要注意的是小於5.3.6的PHP版本,DSN(Data Source Name)是默認忽略 charset 參數的。說明當你傳一個SQL語句做預處理時會發生什麼?它被資料庫伺服器解析和編譯了。通過指定參數(通過之前例子中的 ? 或者像 :name 這樣的命名式參數)你告訴資料庫引擎你是想過濾它。接著當你調用 execute() 函數時,prepared statements會和你剛才指定的參數的值結合。在此重要的是,參數的值是和編譯過的語句結合,而非一個SQL字元串。SQL注入就是當創建被發送到資料庫的SQL語句時,通過欺騙的手段讓腳本去引入惡意的字元串。因此當你使用單獨的參數發送真實正確的SQL時,你就限制了被某些不是你真實意圖的事情而搞掛掉的風險。使用prepared statements 傳遞的任何參數都會被當做字元串對待(不過資料庫引擎可能會做一些優化,這些參數最終也可能變成numbers)(譯者註:意思就是把參數當做一個字元串而不會去做額外的行為)。比如在上面的例子中,如果 $name 變數的值是 ‘Sarah’; DELETE * FROM employees ,產生的結果是會去搜索”‘Sarah’; DELETE * FROM employees”這一整個字元串,最終的結果你也就不會面對的是一張空表了。使用prepared statements的另一個好處是,如果你在同一session中再次執行相同的語句,也就不會被再次解析和編譯,這樣你就獲得一些速度上的提升。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/301857.html