1. mysqli とは
PHP-MySQL 関数ライブラリは、PHP が MySQL データベースを操作するための最もオリジナルな拡張ライブラリであり、PHP-MySQLi の i は Improvement を表し、前者の改良および拡張版に相当します。 、比較的高度な機能も含まれており、さらに、SQL インジェクションやその他の問題の発生を大幅に減らすことができるなど、セキュリティも向上します。
2. mysql と mysqli の概念は関連しています
(1) Mysql と mysqli は両方とも PHP の関数セットであり、mysql データベースとはほとんど関係がありません。
(2) php5 バージョンより前は、mysql_query() 関数など、プロセス指向の mysql データベースを駆動するために PHP の mysql 関数が一般的に使用されていました
(3) php5 バージョン以降、mysqli 関数はある意味、これは mysql_query() に対応する、mysql システム関数の拡張バージョンであり、オブジェクト指向であり、mysql の操作と駆動にオブジェクトを使用します。データベース
3. mysql と mysqli の主な違い
(1) mysql は、接続するたびに接続プロセスを開くため、mysqli の方が消費するリソースが少なくなります。
(2) mysqli は永続的な接続機能です。mysqli を複数回実行すると、同じ接続プロセスが使用されるため、サーバーのオーバーヘッドが軽減されます。 mysqli は、トランザクションなどの一部の高度な操作をカプセル化し、DB 操作プロセスで使用可能な多くのメソッドもカプセル化します。
(3) mysqli はオブジェクト指向プログラミングとプロセス指向プログラミングをサポートしますが、mysql はプロセス指向のみに対応します。 (4) mysqli mysql では実行できない、プリペアド ステートメントによるオーバーヘッドと SQL インジェクションのリスクを軽減できます。
ここでは、オブジェクト指向プログラミングのみを紹介します。
オブジェクト指向関数は
1, データベースに接続し、関連情報を取得します
<?php$mysqli = new mysqli("localhost","db_user","db_passwd","database");# check connectionif (mysqli_connect_errno()) { printf ("Connect failed: %s\n",mysql_connect_error()); exit;}printf ("Host infomation: %s\n",$mysqli->host_info);# close connection$mysqli->close();?>
接続が成功すると、上記のコードが実行され、結果は
<?php$link = mysqli_connect("localhost","db_user","db_passwd","database");# check connectionif (!$link) { printf("Connect failed: %s\n",mysqli_connect_error()); exit;}printf("Host infomation: %s\n",mysqli_get_host_info($link));#close connectionmysqli_close($link);?>になります If the connection失敗した場合、結果は次のようになります。
<?php $mysqli = new mysqli("localhost","root","","mysql"); #如果连接失败 if (mysql_connect_errno()){ echo "数据库连接失败:".mysql_connect_error(); $mysqli = null; exit(); } #获取当前字符集 echo $mysqli->character_set_name()."<br>"; #获取客户端信息 echo $mysqli->get_client_info()."<br>"; #获取mysql主机信息 echo $mysqli->host_info."<br>"; #获取服务器信息 echo $mysqli->server_info."<br>"; #获取服务器版本 echo $mysqli->server_version."<br>"; #关闭数据库连接,严格来说,这并不是必要的,因为脚本执行完毕的时候他们将被自动关闭 $mysqli->close();?>
クエリデータ
latin1mysqlnd 5.0.10 ? 20111026 ? $Id: e707c415db32080b3752b232487a435ee0372157 $localhost via TCP/IP5.6.12-log50612実行結果
连接数据库失败:Access denied for user ‘root’@’localhost’ (using password: YES)连接数据库失败:Unknown database ‘hello’ここで注意する必要があるのは、
<?php $mysqli = new mysqli("localhost","root","","test"); #如果连接失败 if (mysql_connect_errno()){ echo "数据库连接失败:".mysql_connect_error(); $mysqli = null; exit(); } #构造SQL语句 $query = "SELECT * FROM test ORDER BY id LIMIT 3"; #执行SQL语句 $result = $mysqli->query($query); #遍历结果 while ($row = $result->fetch_array(MYSQLI_BOTH)){ echo "id".$row["id"]."<br>"; } #释放结果集 $result=free(); #关闭连接 $mysqli->close();?>
MYSQLI_BOTH が渡された場合、返されるデータのインデックスには数値と名前の両方が含まれます id10062id10063id10064
実際には、同等のメソッド fetch_row()、fetch_assoc() があります
それらの関係は次のとおりです fetch_array(MYSQLI_BOTH)
If fetch_array() メソッド 何も渡されない場合、デフォルトは MYSQLI_BOTH です
array(size=26) 0=>string '10062'(length=5) 'id' => string '10062' (length=5) 1 => string '??' (length=2) 'name' => string '??' (length=2) 2 => string '10169103@qq.com' (length=17) 'email' => string '10169103@qq.com' (length=17) 3 => string '18366119732' (length=11) 'phone' => string '18366119732' (length=11)挿入が成功すると結果は 1 になり、失敗した場合はエラーが報告されます。
4,
コンテンツの変更$result->fetch_row() = mysql_fetch_row() = $result->fetch_array(MYSQLI_NUM) = mysql_fetch_array(MYSQLI_NUM) 返回索引数组$result->fetch_assoc() = mysql_fetch_assoc() = $result->fetch_array(MYSQLI_ASSOC) = mysql_fetch_array(MYSQLI_ASSOC) 返回索引列名
変更が成功すると、変更された行数も返されます。
5,
前処理ステートメント
<?php $mysqli = new mysqli("localhost","root","","test"); #如果连接失败 if (mysql_connect_errno()){ echo "数据库连接失败:".mysql_connect_error(); $mysqli = null; exit(); } #插入数据 $sql = "INSERT INTO test(name,phone) values ("hello","10086")"; #执行插入语句 $result = $mysqli->query($sql); #如果执行错误 if (!$result){ echo "SQL语句有误<br>"; echo "ERROR:".$mysqli->errno."|".$mysqli->error; exit(); } #如果插入成功,则返回影响的行数 echo $mysqli->affected_rows; #关闭数据库连接 $mysqli->close();?>上記の準備されたステートメントを通じて、データを挿入することもできます。
では、前処理にはどのような特徴があるのでしょうか?
安全性: SQL インジェクション (?プレースホルダー) を防ぐことができ、異常な変数のインジェクションを防ぐことができます。
したがって、より効率的であるだけでなく、より安全である mysqli のプリペアドステートメントメソッドを使用することをお勧めします。
-------------------------------------- ------ ----------------------------
MySQLへのHTMLフォーム送信時の文字エンコーディングの問題について
<?php $mysqli = new mysqli("localhost","root","","test"); #如果连接失败 if (mysql_connect_errno()){ echo "数据库连接失败:".mysql_connect_error(); $mysqli = null; exit(); } #执行语句 $sql = "update test set name = 'hello' where id = 10062"; #执行修改语句 $result = $mysqli->query($sql); #如果执行错误 if (!$result){ echo "SQL语句有误<br>"; echo "ERROR:".$mysqli->errno."|".$mysqli->error; exit(); } #如果修改成功,则返回影响的行数 echo $mysqli->affected_rows; #关闭数据库连接 $mysqli->close();?>ここでフォームが定義されており、名前はisbn、許可されているデータ型はtextです
それを渡すにはpostメソッドを使用しますバックエンドの tt.php スクリプト ページに移動します。
<?php $mysqli = new mysqli("localhost","root","","test"); #如果连接失败 if (mysql_connect_errno()){ echo "数据库连接失败:".mysql_connect_error(); $mysqli = null; exit(); } #准备好一条语句放到服务器中,比如插入语句 $sql = "INSERT INTO test(name,email) values (?,?)"; #生成预处理语句 $stmt = $mysqli->prepare($sql); #给站位符号每个 ? 号传值(绑定参数)i d s b,没一个参数为格式化字符,ss代表两个字符串,d代表数字 $stmt = bind_param("ss",$name,$email); #执行 $stmt->excute(); #为变量赋值 $name = "Mike"; $email = "mike@live.cn"; #执行 $stmt->execute(); #执行输出 echo "最后ID".$stmt->insert_id."<br>"; echo "影响了".$stmt->affected_rows."行<br>"; #关闭数据库连接 $mysqli->close();?>実行結果:
<html><body><form action="tt.php" method="post"><head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <meta http-equiv="pragma" content="no-cache">Test input values to MySQL<br></head><br><input type="text" name="isbn" maxlength="13" size="13"> <input type="submit" value="提交"></body></html>
<html><head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <meta http-equiv="pragma" content="no-cache"></head><title> Input to MySQL page!</title><h1> 返回结果:</h1><?php//create short variable names$v = $_POST['isbn']; //获取表单传递过来的值#判断如果值为空,那么打印错误信息,并退出。if (!$v) { echo "you must input some values <br> Please go back and try again."; exit;}#检查是否经过php的魔术字符转换if (!get_magic_quotes_gpc()){ $isbn = addslashes($v);}#定义一个数据库连接对象@ $db = new mysqli('211.162.188.60','test','123.com','test');#设置字符if ( $db->set_charset("utf8") ){ //注意这里是utf8 并不是utf-8 printf("Current charset is: %s <br>",$db->character_set_name());} else { echo "Error: Could not set this charset !";}#检查是否连接数据库错误if (mysqli_connect_errno()) { echo "Error: Could not connect to database. Please try again later."; exit;}#插入数据$insert = "insert into ttt set S22 = '".$isbn."'";#执行插入操作$result = $db->query($insert);#检测是否执行成功if ($result) { echo $db->affected_rows." values inserted into database."; //打印影响行数} else { echo "An error has occurred. The item was not added.";}#关闭连接$db->close();?>