链接Mysql的api mysqli和pdo
HP 5 及以上版本建議使用以下方式連接 MySQL :
- MySQLi extension?("i" 意為 improved)
- PDO (PHP Data Objects)
PDO 應(yīng)用在 12 種不同數(shù)據(jù)庫(kù)中, MySQLi 只針對(duì) MySQL 數(shù)據(jù)庫(kù)。
如果你的項(xiàng)目需要在多種數(shù)據(jù)庫(kù)中切換,建議使用 PDO?
兩者都是面向?qū)ο? 但 MySQLi 還提供了 API 接口
兩者都支持預(yù)處理語(yǔ)句。 預(yù)處理語(yǔ)句可以防止 SQL 注入,對(duì)于 web 項(xiàng)目的安全性是非常重要的?
連接mysql實(shí)例
,我們會(huì)使用以下三種方式來(lái)演示 PHP 操作 MySQL:
- MySQLi (面向?qū)ο?
- MySQLi (面向過(guò)程)
- PDO
mysqi的面向過(guò)程
如下包含連接數(shù)據(jù)庫(kù)、創(chuàng)建數(shù)據(jù)庫(kù)、創(chuàng)建表、插入一條數(shù)據(jù)、插入多條數(shù)據(jù)
<?php //面向過(guò)程連接數(shù)據(jù)庫(kù) $conn = mysqli_connect('localhost','root','root'); //判斷是否連接成功 if(!$conn){die('連接數(shù)據(jù)庫(kù)失敗'.mysqli_connect_error()); }else{echo '連接成功';//創(chuàng)建數(shù)據(jù)庫(kù)mytest$sql = 'create database mytest';if(mysqli_query($conn,$sql)){echo '執(zhí)行成功'.$sql;}else{echo '執(zhí)行失敗'.mysqli_error($conn);}//選擇數(shù)據(jù)庫(kù)并且創(chuàng)建表執(zhí)行插入語(yǔ)句if(mysqli_query($conn,'use mytest')){echo '切換數(shù)據(jù)庫(kù)成功';$sql = "create table mytest(id int auto_increment primary key,name varchar(14) not null) ";//如創(chuàng)建表成功if(mysqli_query($conn,$sql)){echo '創(chuàng)建成功'.$sql;}else{echo '創(chuàng)建失敗'.mysqli_error($conn);}//插入多條數(shù)據(jù) 插入一條數(shù)據(jù)時(shí)候后面不需要分號(hào)$sql="insert into mytest (name) values ('webcyh');";$sql.="insert into mytest (name) values ('hony');";//如果只是插入一條數(shù)據(jù)這里可以改為普通查詢(xún)函數(shù)mysqli_query()if(mysqli_multi_query($conn,$sql)){echo '插入成功'.$sql;}else{echo '插入失敗'.mysqli_error($conn);}}//關(guān)閉數(shù)據(jù)庫(kù)連接mysqli_close($conn); }語(yǔ)句預(yù)處理
預(yù)處理語(yǔ)句對(duì)于防止 MySQL 注入是非常有用的
預(yù)處理語(yǔ)句用于執(zhí)行多個(gè)相同的 SQL 語(yǔ)句,并且執(zhí)行效率更高
預(yù)處理語(yǔ)句的工作原理如下:
預(yù)處理:創(chuàng)建 SQL 語(yǔ)句模板并發(fā)送到數(shù)據(jù)庫(kù)。預(yù)留的值使用參數(shù) "?" 標(biāo)記 。例如:
INSERT INTO MyGuests (firstname, lastname, email) VALUES(?, ?, ?)數(shù)據(jù)庫(kù)解析,編譯,對(duì)SQL語(yǔ)句模板執(zhí)行查詢(xún)優(yōu)化,并存儲(chǔ)結(jié)果不輸出。
執(zhí)行:最后,將應(yīng)用綁定的值傳遞給參數(shù)("?" 標(biāo)記),數(shù)據(jù)庫(kù)執(zhí)行語(yǔ)句。應(yīng)用可以多次執(zhí)行語(yǔ)句,如果參數(shù)的值不一樣。
相比于直接執(zhí)行SQL語(yǔ)句,預(yù)處理語(yǔ)句有兩個(gè)主要優(yōu)點(diǎn):
-
預(yù)處理語(yǔ)句大大減少了分析時(shí)間,只做了一次查詢(xún)(雖然語(yǔ)句多次執(zhí)行)。
-
綁定參數(shù)減少了服務(wù)器帶寬,你只需要發(fā)送查詢(xún)的參數(shù),而不是整個(gè)語(yǔ)句。
-
預(yù)處理語(yǔ)句針對(duì)SQL注入是非常有用的,因?yàn)閰?shù)值發(fā)送后使用不同的協(xié)議,保證了數(shù)據(jù)的合法性。
?
mysqli查詢(xún)語(yǔ)句遇到問(wèn)題
原因分析:
消息說(shuō)明MYSQL數(shù)據(jù)庫(kù)認(rèn)為是這一個(gè)錯(cuò)誤的命令執(zhí)行順序。原因在于MYSQL的存儲(chǔ)過(guò)程執(zhí)行完成后除了返回實(shí)際結(jié)果集還會(huì)返回存儲(chǔ)過(guò)程執(zhí)行的轉(zhuǎn)態(tài)
,而上面的代碼僅處理了第一個(gè)結(jié)果集,第二個(gè)結(jié)果集并沒(méi)有被釋放掉
建議使用mysqli_query()插入數(shù)據(jù) 每條語(yǔ)句只插入一條數(shù)據(jù)
解決后的代碼:
<?php //面向過(guò)程連接數(shù)據(jù)庫(kù) $conn = mysqli_connect('localhost','root','root'); //判斷是否連接成功 if(!$conn){die('連接數(shù)據(jù)庫(kù)失敗'.mysqli_connect_error()); }else{echo '連接成功';//創(chuàng)建數(shù)據(jù)庫(kù)mytest$sql = 'create database mytest';if(mysqli_query($conn,$sql)){echo '執(zhí)行成功'.$sql;}else{echo '執(zhí)行失敗'.mysqli_error($conn);}//選擇數(shù)據(jù)庫(kù)并且創(chuàng)建表執(zhí)行插入語(yǔ)句if(mysqli_query($conn,'use mytest')){echo '切換數(shù)據(jù)庫(kù)成功';$sql = "create table mytest(id int auto_increment primary key,name varchar(14) not null) ";//如創(chuàng)建表成功if(mysqli_query($conn,$sql)){echo '創(chuàng)建成功'.$sql;}else{echo '創(chuàng)建失敗'.mysqli_error($conn);}//插入多條數(shù)據(jù)$sql="insert into mytest (name) values ('webcyh');";$sql.="insert into mytest (name) values ('hony');"; mysqli_autocommit($conn,FALSE);if (mysqli_multi_query($conn,$sql)){do {if ($result = mysqli_store_result()) {while ($row = result_fetch_row($rst)) {echo $row[0];}}} while (mysqli_next_result($conn));}mysqli_commit($conn);$sql='select name from mytest';$rst=mysqli_query($conn,$sql);var_dump($rst);//判斷是否有結(jié)果if(mysqli_num_rows($rst)>0){echo '查詢(xún)結(jié)果如下';while($row=mysqli_fetch_assoc($rst)){echo '姓名'.$row["name"];}}else{echo '沒(méi)有結(jié)果'.mysqli_error($conn);}//查詢(xún)數(shù)據(jù)并且輸出 }//關(guān)閉數(shù)據(jù)庫(kù)連接mysqli_close($conn); }輸出結(jié)果:
?mysqli面向?qū)ο蠓绞竭B接mysql數(shù)據(jù)庫(kù)
<?php //mysqli面向?qū)ο笫褂胢ysql實(shí)例 如果你使用其他端口(默認(rèn)為3306),為數(shù)據(jù)庫(kù)參數(shù)添加空字符串,如: new mysqli("localhost", "username", "password", "", port) $conn = new mysqli('localhost','root','root'); //判斷是否連接成功 if($conn->connect_error){echo '連接失敗'.$conn->connect_error;//或者mysqli_connect_error(); }else{ //切換數(shù)據(jù)庫(kù)$sql='use mytest';if($conn->query($sql) == TRUE){echo '切換成功';//插入數(shù)據(jù)使用語(yǔ)句預(yù)處理操作$stml=$conn->prepare("insert into test(name) values(?)");//綁定參數(shù)$stml->bind_param("s",$name);$name='webcyh';$stml->execute();echo '插入成功';$stml->close();//查詢(xún)數(shù)據(jù)$sql='select * from test';$rst=$conn->query($sql);if($rst->num_rows>0){while($row = $rst->fetch_assoc()){echo $row['name'];}}}else{echo '切換失敗'.$conn->error;}}//關(guān)閉數(shù)據(jù)庫(kù) $conn->close();?
?
?
?
"INSERT INTO MyGuests (firstname, lastname, email) VALUES(?, ?, ?)"
在 SQL 語(yǔ)句中,我們使用了問(wèn)號(hào) (?),在此我們可以將問(wèn)號(hào)替換為整型,字符串,雙精度浮點(diǎn)型和布爾值。
$stmt->bind_param("sss", $firstname, $lastname, $email);
該函數(shù)綁定了 SQL 的參數(shù),且告訴數(shù)據(jù)庫(kù)參數(shù)的值。 "sss" 參數(shù)列處理其余參數(shù)的數(shù)據(jù)類(lèi)型。s 字符告訴數(shù)據(jù)庫(kù)該參數(shù)為字符串。
參數(shù)有以下四種類(lèi)型:
- i - integer(整型)
- d - double(雙精度浮點(diǎn)型)
- s - string(字符串)
- b - BLOB(binary large object:二進(jìn)制大對(duì)象)
?
轉(zhuǎn)載于:https://www.cnblogs.com/webcyh/p/11281028.html
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來(lái)咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)總結(jié)
以上是生活随笔為你收集整理的链接Mysql的api mysqli和pdo的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 【Python爬虫】爬虫程序的简单处理过
- 下一篇: mysql用代码建表基础语法