ホームページ バックエンド開発 PHPチュートリアル PHPのMySQLi関数ライブラリの使用とフォーム文字エンコーディングの設定

PHPのMySQLi関数ライブラリの使用とフォーム文字エンコーディングの設定

Jun 23, 2016 pm 01:30 PM

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 インジェクションのリスクを軽減できます。


要約すると、PHP5 を使用していて、mysql のバージョンが 5.0 以降の場合は、将来 mysqli を使用できるようになったら、効率的であるだけでなく、より安全である mqsqli を使用してみてください。そして、誰もがオブジェクト指向をプログラム的に使用することをお勧めします。


ここでは、オブジェクト指向プログラミングのみを紹介します。


オブジェクト指向関数は

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();?>
ログイン後にコピー


2 .

クエリデータ

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();?>
ログイン後にコピー

このメソッドには 3 つのパラメータがあります。 MYSQLI_BOTH、 MYSQLI_NUM、および MYSQLI_ASSOC。

MYSQLI_BOTH が渡された場合、返されるデータのインデックスには数値と名前の両方が含まれます

id10062id10063id10064
ログイン後にコピー
実際には、同等のメソッド fetch_row()、fetch_assoc() があります

それらの関係は次のとおりです

fetch_array(MYSQLI_BOTH)
ログイン後にコピー

If fetch_array() メソッド 何も渡されない場合、デフォルトは MYSQLI_BOTH です


3、データを挿入します

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フォーム送信時の文字エンコーディングの問題について



まず、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 スクリプト ページに移動します。


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();?>
ログイン後にコピー

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

PHPロギング:PHPログ分析のベストプラクティス PHPロギング:PHPログ分析のベストプラクティス Mar 10, 2025 pm 02:32 PM

PHPロギングは、Webアプリケーションの監視とデバッグ、および重要なイベント、エラー、ランタイムの動作をキャプチャするために不可欠です。システムのパフォーマンスに関する貴重な洞察を提供し、問題の特定に役立ち、より速いトラブルシューティングをサポートします

Laravelでフラッシュセッションデータを使用します Laravelでフラッシュセッションデータを使用します Mar 12, 2025 pm 05:08 PM

Laravelは、直感的なフラッシュメソッドを使用して、一時的なセッションデータの処理を簡素化します。これは、アプリケーション内に簡単なメッセージ、アラート、または通知を表示するのに最適です。 データは、デフォルトで次の要求のためにのみ持続します。 $リクエスト -

PHPのカール:REST APIでPHPカール拡張機能を使用する方法 PHPのカール:REST APIでPHPカール拡張機能を使用する方法 Mar 14, 2025 am 11:42 AM

PHPクライアントURL(CURL)拡張機能は、開発者にとって強力なツールであり、リモートサーバーやREST APIとのシームレスな対話を可能にします。尊敬されるマルチプロトコルファイル転送ライブラリであるLibcurlを活用することにより、PHP Curlは効率的なexecuを促進します

Laravelテストでの簡略化されたHTTP応答のモッキング Laravelテストでの簡略化されたHTTP応答のモッキング Mar 12, 2025 pm 05:09 PM

Laravelは簡潔なHTTP応答シミュレーション構文を提供し、HTTP相互作用テストを簡素化します。このアプローチは、テストシミュレーションをより直感的にしながら、コード冗長性を大幅に削減します。 基本的な実装は、さまざまな応答タイプのショートカットを提供します。 Illuminate \ support \ facades \ httpを使用します。 http :: fake([[ 'google.com' => 'hello world'、 'github.com' => ['foo' => 'bar']、 'forge.laravel.com' =>

Codecanyonで12の最高のPHPチャットスクリプト Codecanyonで12の最高のPHPチャットスクリプト Mar 13, 2025 pm 12:08 PM

顧客の最も差し迫った問題にリアルタイムでインスタントソリューションを提供したいですか? ライブチャットを使用すると、顧客とのリアルタイムな会話を行い、すぐに問題を解決できます。それはあなたがあなたのカスタムにより速いサービスを提供することを可能にします

PHPにおける後期静的結合の概念を説明します。 PHPにおける後期静的結合の概念を説明します。 Mar 21, 2025 pm 01:33 PM

記事では、PHP 5.3で導入されたPHPの後期静的結合(LSB)について説明し、より柔軟な継承を求める静的メソッドコールのランタイム解像度を可能にします。 LSBの実用的なアプリケーションと潜在的なパフォーマ

フレームワークのカスタマイズ/拡張:カスタム機能を追加する方法。 フレームワークのカスタマイズ/拡張:カスタム機能を追加する方法。 Mar 28, 2025 pm 05:12 PM

この記事では、フレームワークにカスタム機能を追加し、アーキテクチャの理解、拡張ポイントの識別、統合とデバッグのベストプラクティスに焦点を当てています。

See all articles