preparephp
A. [追加30分] 請問php中如何操作mysql資料庫。
//上面要有連接數據源的內容$link
$dpassword=$_POST[dpassword];
$sql="select * from test where dpassword='$dpassword'";
$result=mysql_query($sql,$link);
$row=mysql_num_rows($result);
if($row < 1){
echo "密碼錯誤";
}else{
$sql="delete from test where dpassword='$dpassword'";
mysql_query($sql,$link);
echo "刪除成功";
}
B. 在php擴展中,如果實現以下mysql功能一條語句實現
- Mysqli是php5之後才有的功能,沒有開啟擴展的朋友可以打開您的php.ini的配置文件。
查找下面的語句:;extension=php_mysqli.dll將其修改為:extension=php_mysqli.dll即可。
相對於mysql有很多新的特性和優勢
(1)支持本地綁定、准備(prepare)等語法
(2)執行sql語句的錯誤代碼
(3)同時執行多個sql
(4)另外提供了面向對象的調用介面的方法。
下面一一用php實例進行mysqli資料庫連接!
使用方法一:使用傳統的面向過程的方法
php代碼如下:
<?php
$connect=mysqli_connect('localhost','root','','volunteer')ordie('Unaletoconnect');
$sql="select*fromvol_msg";
$result=mysqli_query($connect,$sql);
while($row=mysqli_fetch_row($result)){
echo$row[0];
}
?>
使用方法二:使用面向對象的方法調用介面(推薦使用)
看php代碼如下:
復制代碼代碼如下:
<?php
//創建對象並打開連接,最後一個參數是選擇的資料庫名稱
$mysqli=newmysqli('localhost','root','','volunteer');
//檢查連接是否成功
if(mysqli_connect_errno()){
//注意mysqli_connect_error()新特性
die('Unabletoconnect!').mysqli_connect_error();
}
$sql="select*fromvol_msg";
//執行sql語句,完全面向對象的
$result=$mysqli->query($sql);
while($row=$result->fetch_array()){
echo$row[0];
}
?>
以上兩個php實例運行的結果完全相同,可以清楚的看到使用mysqli類對象構建資料庫連接的優勢!
插入和修改記錄我就不用講了,只要更改一下sql語句就行,下一篇我會講prepare介面特性!
C. PHP 使用 Mysqli 的 prepare 語句有什麼好處
好處:
(1)解析查詢只有一次
(2)執行一些查詢優化步驟只有一次
(3)通過二進制協議發送參數比送他們為ASCII文本更有效
比如DATE,對於准備之後,發送日期只用3個位元組;如果沒有準備,日期必須以字元串的形式發送,需要資料庫方再解析,這樣需要發送10個位元組。
(4)只有參數(不是整個查詢文本)需要為每個執行要發送
(5)的MySQL直接存儲parameteres到伺服器上的緩沖區
(6)安全性也有幫助,就沒有必要逃避或引用值。
壞處:
(1)本地到一個連接,以便另一個連接不能再使用
(2)不能使用MySQL查詢緩存(5.1版本之前)
(3)不總是更有效,如果你使用它只有一次
(4)存儲函數中不能使用(存儲過程是可以的)
(5)有可能會導致「泄漏」如果你忘記釋放它
D. yaf框架中,PHP Fatal error: Call to a member function prepare() on a non-object;
是語法錯誤,是沒有找到函數的錯誤,是沒有載入PDO擴展造成的。
PHP中查看phpinfo參數,是否載入並擴展了PDO,需要載入,否則解釋錯誤
更多問題到問題求助專區http://bbs.hounwang.com/
E. PHP採用pdo方式訪問資料庫時,exec方法和prepare方法有什麼區別
區別是:
PHP採用pdo方式訪問資料庫時,您不必再使用再為它們封裝資料庫操作類,只需要使用PDO介面中的方法就可以對各種資料庫進行操作。
F. php 使用mysql 的prepare預編譯,下面這段代碼有防sql注入的功能么請高手賜教
sql注入怎麼回事:說白了就是在一個單引號上做文章,你把單引號轉義就沒啥問題了,預編譯就是把這些字元轉義後插入,其中包括單引號。
這段可以防止.
G. php預處理執行為什麼
預處理語句與存儲過程 :
很多更成熟的資料庫都支持預處理語句的概念。什麼是預處理語句?可以把它看作是想要運行的 SQL 的一種編譯過的模板,它可以使用變數參數進行定製。預處理語句可以帶來兩大好處:
查詢僅需解析(或預處理)一次,但可以用相同或不同的參數執行多次。當查詢准備好後,資料庫將分析、編譯和優化執行該查詢的計劃。對於復雜的查詢,此過程要花費較長的時間,如果需要以不同參數多次重復相同的查詢,那麼該過程將大大降低應用程序的速度。通過使用預處理語句,可以避免重復分析/編譯/優化周期。簡言之,預處理語句佔用更少的資源,因而運行得更快。
提供給預處理語句的參數不需要用引號括起來,驅動程序會自動處理。如果應用程序只使用預處理語句,可以確保不會發生SQL 注入。(然而,如果查詢的其他部分是由未轉義的輸入來構建的,則仍存在 SQL 注入的風險)。
預處理語句如此有用,以至於它們唯一的特性是在驅動程序不支持的時PDO 將模擬處理。這樣可以確保不管資料庫是否具有這樣的功能,都可以確保應用程序可以用相同的數據訪問模式。
Example #1 用預處理語句進行重復插入
下面例子通過用name和value替代相應的命名佔位符來執行一個插入查詢
<?php
$stmt=$dbh->prepare("INSERTINTOREGISTRY(name,value)VALUES(:name,:value)");
$stmt->bindParam(':name',$name);
$stmt->bindParam(':value',$value);
//插入一行
$name='one';
$value=1;
$stmt->execute();
//用不同的值插入另一行
$name='two';
$value=2;
$stmt->execute();
?>
Example #2 用預處理語句進行重復插入
下面例子通過用name和value取代?佔位符的位置來執行一條插入查詢。
<?php
$stmt=$dbh->prepare("INSERTINTOREGISTRY(name,value)VALUES(?,?)");
$stmt->bindParam(1,$name);
$stmt->bindParam(2,$value);
//插入一行
$name='one';
$value=1;
$stmt->execute();
//用不同的值插入另一行
$name='two';
$value=2;
$stmt->execute();
?>
Example #3 使用預處理語句獲取數據
下面例子獲取數據基於鍵值已提供的形式。用戶的輸入被自動用引號括起來,因此不會有 SQL 注入攻擊的危險。
<?php
$stmt=$dbh->prepare("SELECT*FROMREGISTRYwherename=?");
if($stmt->execute(array($_GET['name']))){
while($row=$stmt->fetch()){
print_r($row);
}
}
?>
如果資料庫驅動支持,應用程序還可以綁定輸出和輸入參數.輸出參數通常用於從存儲過程獲取值。輸出參數使用起來比輸入參數要稍微復雜一些,因為當綁定一個輸出參數時,必須知道給定參數的長度。如果為參數綁定的值大於建議的長度,就會產生一個錯誤。
Example #4 帶輸出參數調用存儲過程
<?php
$stmt=$dbh->prepare("CALLsp_returns_string(?)");
$stmt->bindParam(1,$return_value,PDO::PARAM_STR,4000);
//調用存儲過程
$stmt->execute();
print"procerereturned$return_value ";
?>
還可以指定同時具有輸入和輸出值的參數,其語法類似於輸出參數。在下一個例子中,字元串「hello」被傳遞給存儲過程,當存儲過程返回時,hello 被替換為該存儲過程返回的值。
Example #5 帶輸入/輸出參數調用存儲過程
<?php
$stmt=$dbh->prepare("CALLsp_takes_string_returns_string(?)");
$value='hello';
$stmt->bindParam(1,$value,PDO::PARAM_STR|PDO::PARAM_INPUT_OUTPUT,4000);
//調用存儲過程
$stmt->execute();
print"procerereturned$value ";
?>
Example #6 佔位符的無效使用
<?php
$stmt=$dbh->prepare("SELECT*FROMREGISTRYwherenameLIKE'%?%'");
$stmt->execute(array($_GET['name']));
//佔位符必須被用在整個值的位置
$stmt=$dbh->prepare("SELECT*FROMREGISTRYwherenameLIKE?");
$stmt->execute(array("%$_GET[name]%"));
?>