PDO:php5php
假如如下是一個簡單的登陸處理:前端
使用PDO鏈接mysql首先:mysql
新建數據庫sql
new PDO("mysql:host=localhost;dbname=test","root","root");
host:服務器
dbname:數據庫名
後面兩個分別是賬號和密碼
默認不是長鏈接數據庫
若是想使用長鏈接須要在後面加入參數:數組
new PDO("mysql:host=host;dbname=name","user","pw","array(PDO::ATTR_PERSISTENT => true) ");
看以下簡單示例,在這裏是單獨說明,因此我沒有加其餘的東西:服務器
<?php //接收前端傳過來的變量 $name=$_POST['username']; $pwd=$_POST['password']; //這裏新建PDO鏈接,在這裏我是本地測試的因此host我使用了localhost 數據庫名爲test,賬號爲root密碼也是root $stmt = new PDO("mysql:host=localhost;dbname=test","root","root"); //使用prepare進行預處理,其中:name和:pwd是咱們等下要傳入的變量值,這些都是佔位符 $stmt = $stmt->prepare('SELECT * FROM user1 WHERE user1 = :name and pw1 = :pwd'); //以上的準備都作好了以後,咱們使用execute()方法負責執行準備好的查詢 //該方法須要有每次迭代執行中替換的輸入參數,在這裏就是:name和:pwd 做爲數組將值傳遞給方法 //從而值替換掉其中佔位符 //固然也可使用bindParam,可是我仍是喜歡這種簡單的方式,畢竟人懶 $stmt->execute(array('name' => $name,'pwd'=>$pwd)); while ($row = $stmt->fetch()) { print_r($row); }
註釋已經說明了要說的內容,最後面使用while輸出查詢到的值,這樣就能夠防止sql注入,若是不行,那麼請自行測試,輸入如:’ or 1=1#
咱們看咱們的’ or 1=1#,若是咱們的name輸入的是’ or 1=1#,注意 ’ or 1=1# 前面有一個單引號,那麼若是咱們的sql語句本是以下:測試
SELECT * FROM user1 WHERE user1='123' AND pw1='234'
把user1的值改成了 ’ or 1=1# 後。
變成了fetch
SELECT * FROM user1 WHERE user1='' OR 1=1# and pw1='234'
其中因爲sql中#表明:到此結束,那麼說明後面的:and pw1=’234’都將無效,那麼咱們的sql語句就等於變成了以下語句:spa
SELECT * FROM user1 WHERE user1='' OR 1=1
因爲1=1是確定成立的,那麼此句sql語句中的where條件將會永遠正確,此時,語句變成或者說就等於了以下語句:
SELECT * FROM user1 WHERE TRUE
或者說:
SELECT * FROM user1
那麼就會登陸成功,繞過了這次登陸。