MySQLiはすべおを棚に眮きたす



この蚘事の察象者 この蚘事の䞻な目的は、mysqliを既に䜿甚したが、深く掘り䞋げたわけではないが、すぐにラッパヌを曞いお元の構文を忘れた人のために「すべおを棚に眮く」こずでした。 正芏化を知らない人によっお蚭蚈された倧芏暡で非垞に叀いデヌタベヌスから、構造が倧幅に倉曎された新しいデヌタベヌスにデヌタを転送するずきに遭遇するニュアンスを明確にしようずしたした。



叀いmysql拡匵機胜をただ䜿甚しおいお、PDOたたはMySqliに切り替えるこずのみを考えおいる人にこの蚘事を読むこずは可胜ですか それも必芁だず思いたす。





MySqliたたはPDO



近幎、私はフレヌムワヌク専甚のWebサむトを䜜成したした。これにより、デヌタベヌスを盎接操䜜する必芁がなくなりたした。 しばらく前、私は玔粋なphpでサむトの䜜業を開始し、叀いMySQL PHP拡匵機胜の䜿甚は掚奚されおいたせん。



MySqliずPDOを遞択する必芁がありたした。 それほど長くない研究の埌、MySqliに立ち寄るこずに決めたした。それは、圓時私には思われたように、MySQLを攟棄しお他の䜕かを支持する方法がなかったこずを陀いお、PDOずたったく同じだったからです。 以䞋に曞いおいるように、これは完党に真実ではありたせんが、少なくずも1぀の顕著な違いがありたす。



MySqliは、PHP開発者自身が䜿甚するこずをお勧めしたす[ 1 ]



OOPず手続き型むンタヌフェヌス



MySqliを䜿甚するず、OOPスタむルず手続きスタむルの䞡方でコヌドを蚘述できたす。 OOPはほずんどのhabrコミュニティに関しお私に近いので、この蚘事で䜿甚したす。



3぀の䞻芁なクラス



MySqliには3぀の䞻芁なクラスがあり、これらに぀いおはこの蚘事で詳しく説明したす。

  1. mysqli-デヌタベヌスぞの接続を確立するために必芁で、叀いMySQL拡匵で行ったのず同じ方法でク゚リを実行する堎合に圹立ちたす。
  2. mysqli_stmt-新しいMySqli機胜を䜿甚するために必芁です。準備された匏に察しおク゚リを実行したす。
  3. mysqli_result-関数を組み合わせお、mysqliたたはmysqli_stmtを䜿甚しお䜜成されたク゚リの結果を取埗したす。


以䞋で、それぞれに぀いお詳しく芋おいきたしょう。



DB接続



2぀の方法がありたす。



最初の方法。 接続を䜜成する必芁がある堎合。

$ mysqli = new mysqli  'localhost' 、 'my_user' 、 'my_password' 、 'my_db'  ;

if  $ mysqli- > connect_error  {

die  'Connect Error' 。 $ mysqli- > connect_errno 。 '' 。 $ mysqli- > connect_error  ;

}




2番目の方法。 接続オプションを䜿甚する必芁がある堎合。

$ mysqli = mysqli_init   ;

if   $ mysqli  {

die  'mysqli_init failed'  ;

}



if   $ mysqli- > options  MYSQLI_INIT_COMMAND 、 'SET AUTOCOMMIT = 0'   {

die  「MYSQLI_INIT_COMMANDの蚭定に倱敗したした」  ;

}



if   $ mysqli- > real_connect  'localhost' 、 'my_user' 、 'my_password' 、 'my_db'   {

die  'Connect Error' 。 $ mysqli- > connect_errno 。 '' 。 $ mysqli- > connect_error  ;

}




$ mysqli-> connect_errnoおよび$ mysqli-> connect_errorを䜿甚しお、接続䞭に発生した説明ず゚ラヌコヌドを取埗したす。 新しいmysqliず$ mysqli-> real_connectの䞡方が、゚ラヌの接続時にPHP譊告゚ラヌを匕き起こしたす。 したがっお、䞊蚘の関数を䜿甚した゚ラヌ出力は、実皌働サヌバヌなどでPHP゚ラヌ衚瀺を無効にしおいる堎合、たたは䜕らかの方法でこのデヌタを凊理する必芁がある堎合に意味がありたす。 ゚ラヌの堎合にすべおのMySQLi関数がPHP譊告を呌び出すわけではなく、゚ラヌが発生したこずを確認するために、特別な関数を参照する必芁があるため、ここでこれに぀いお蚀及したした。



接続䞭に取埗したオブゞェクトは、将来䜿甚するために$ mysqli倉数に割り圓おられたした。 これはOOPスタむルでは明らかですが、手続き型スタむルではこのオブゞェクトも必芁です。これは、mysql関数を䜿甚するたびに接続参照を枡す必芁がなかったレガシヌMySQL拡匵ずは察照的です。



バッファ付きおよびバッファなしの結果



さらに説明する前に、これら2぀のタむプの結果の違いに぀いお説明したいず思いたす。



バッファなしの結果を考慮しおください。 この堎合、mysqlサヌバヌが結果を完党に受信するたで埅たずに結果の読み取りを開始できたす。



利点



短所





バッファリングされた結果には、これらの欠点がないため、リストされおいる利点がありたせん。



クラシックク゚リ



MySqliは、「叀兞的な」ク゚リの可胜性を残したした。ナヌザヌが、送信されたク゚リのセキュリティに独自に関䞎するよう招埅された堎合、レガシヌMySQL拡匵の堎合ず同様です。 これを行うには、関数$ mysqli-> real_escape_stringを䜿甚するこずをお勧めしたす。この関数では、ク゚リに配眮する前にすべおのデヌタを凊理する必芁がありたす。



接続の堎合ず同様に、このようなリク゚ストを短くする方法ず長くする方法の2぀がありたす。



短い。

$ result = $ mysqli- > query  'query text' 、 MYSQLI_USE_RESULT  ;


可胜な定数

MYSQLI_STORE_RESULT-バッファリングされた結果、デフォルト倀を返したす

MYSQLI_USE_RESULT-バッファなし



長い。

$ mysqli- > real_query  'query text'  ;

echo  $ mysqli- > field_count  ; //結果ずしお列の数を返したす

//結果を受け取る前に取埗できるため、柔軟性が向䞊したす

//短いメ゜ッドず比范しお、もちろん、呌び出す必芁はありたせん

$ result = $ mysqli- > use_result   ; //バッファなしの結果を返したす

//たたは

$ result = $ mysqli- > store_result   ; //バッファされた結果を返したす




関数$ mysqli-> use_resultたたは$ mysqli-> store_resultは、耇数ク゚リ耇数のク゚リで構成されるク゚リにも䜿甚されたす。 この蚘事の耇数のリク゚ストは考慮されたせん。



これらの構文は䞡方ずもmysqli_resultオブゞェクトの圢匏で結果を返したす。これは、バッファ付きおよびバッファなしの䞡方で結果を操䜜するための䟿利なむンタヌフェむスです。



䞊蚘で曞いたように、すべおのMySQLi関数がPHP゚ラヌをスロヌするずは限りたせん。 リク゚ストが正しくなく、サヌバヌが゚ラヌを返した堎合、PHPはナヌザヌに通知したせん。 確認するには、次の機胜を䜿甚したす。



$ city = $ mysqli- > real_escape_string  $ city  ;

$ mysqli- > query  "SELECT * FROM` city` WHERE` id` = ' $ city ' "  ;

if  $ mysqli- > errno  {

die  'Select Error' 。 $ mysqli- > errno 。 '' 。 $ mysqli- > error  ;

}




「クラシック」ク゚リ構文の利点

  1. 準備された匏 mysqli_stmtクラスよりもはるかにコンパクトです。
  2. これにより、バッファリングされおいない結果をmysqli_resultの圢匏で取埗できたす。 準備された匏を䜿甚するず、バッファリングされたmysqli_resultの結果のみを取埗できたす。たた、バッファリングされおいないmysqli_stmtツヌルを䜿甚する必芁がありたす。これはmysqli_resultよりも柔軟性が劣りたす。




私が芋る「叀兞的な」ク゚リ構文の実甚的なアプリケヌション

  1. バッファリングされおいないク゚リで、 mysqli_resultでの䜜業を利甚したい堎合。
  2. INSERT、UPDATE、REPLACE、たたはDELETEク゚リで、より短い構文を䜿甚する堎合。


このようなク゚リでは、次のプロパティが圹立ちたす。



準備されたリク゚スト



「クラシック」に察する準備枈みク゚リの利点



mysqli_stmtクラスは、MySQLiで準備されたク゚リを操䜜したす。



準備枈みク゚リを䜜成する2぀の方法。

//最初の方法-mysqliオブゞェクトを䜿甚

$ mysqli- > prepare  "SELECT * FROM` sk2_articles` WHERE` id` = "  ;

if  $ mysqli- > errno  {

die  'Select Error' 。 $ mysqli- > errno 。 '' 。 $ mysqli- > error  ;

}



// 2番目の方法-mysqli_stmtオブゞェクトを䜿甚

$ stmt = $ mysqli- > stmt_init   ;

$ stmt- > prepare  "SELECT * FROM` sk2_articles` WHERE` id` = "  ;

if  $ stmt- > errno  {

die  'Select Error' 。 $ stmt- > errno 。 '' 。 $ stmt- > error  ;

}




違いは、゚ラヌ情報関数が呌び出されるオブゞェクトです。 2番目の方法は、゚ラヌチェックを他のmysqli_stmt関数を䜿甚しおifブロックに結合できるため、より䟿利に思えたす。 これを行う方法は、以䞋の䟋で芋るこずができたす。



$ id_min = 81 ;

$ id_max = 88 ;

$ stmt = $ mysqli- > stmt_init   ;

if 

//リク゚ストを準備したす。デヌタをどこに挿入するか、シンボルでマヌクしたすか プレヌスホルダヌ

 $ stmt- > prepare  "sk2_articlesからタむトルを遞択WHERE id>and id <"  === FALSE 

//倉数をプレヌスホルダヌにバむンドしたす

たたは $ stmt- > bind_param  'ii' 、 $ id_min 、 $ id_max  === FALSE 

//珟圚バむンドされおいる倉数にあるデヌタを送信したす

たたは $ stmt- > execute   === FALSE 

//倉数をバむンドしお、結果を取埗したす

たたは $ stmt- > bind_result  $ title  === FALSE 

//リク゚ストをバッファリングし、

//この行がそうでない堎合、リク゚ストはバッファリングされたせん

たたは $ stmt- > store_result   === FALSE 

//バむンドされた倉数で結果を取埗したす

たたは $ stmt- > fetch   === FALSE 

//準備されたリク゚ストを閉じたす

たたは $ stmt- > close   === FALSE 

 {

die  'Select Error' 。 $ stmt- > errno 。 '' 。 $ stmt- > error  ;

}

echo $ title ;




䞊蚘のコヌドのいく぀かの説明。

  1. $ stmt-> bind_paramでは、最初のパラメヌタヌはバむンドするデヌタのタむプですi-敎数、d-double、s-ストリング。 2番目ず2番目は、 $ stmt-> prepareで文字「」で宣蚀された察応するプレヌスホルダヌにバむンドされる倉数です。 それらは$ stmt-> prepareにリストされおいる順序で。 これは、Plesholdoryに名前を付けるこずができるPDOずの顕著な違いであるため、発衚の順序に䟝存したせん。
  2. $ stmt-> bind_resultは、私の意芋では、 mysqli_stmtクラスの最も匱い点です。これは、リク゚ストからどのデヌタを受信し、リク゚ストでどの順序で宣蚀されるかを知る必芁があるためです。 「SELECT * FROM ...」の堎合、ほずんど適甚されたせん。 mysqli_resultクラスは、結果を凊理するためのはるかに柔軟なアプロヌチを提䟛したす。 完党に客芳的であるために、 $ stmt-> result_metadata 関数を䜿甚しお、デヌタ自䜓のないメタデヌタのみを含むmysqli_resultを取埗し、受信した列を確認できるこずに蚀及する䟡倀がありたすが、䞍正確な情報の告発を避けるため。
  3. $ stmt-> store_resultは、行のコメントで曞いたようにオプションであり、次のような関数を䜿甚するために必芁です。

    • $ mysqli_stmt-> num_rows-結果の受信行数、
    • $ stmt-> data_seek-内郚ポむンタを指定された結果文字列に移動し、
    • $ stmt-> free_result -たた、 $ stmt-> store_resultを䜿甚した堎合は、空きメモリを呌び出すこずを忘れないでください。


  4. $ stmt-> fetchは、デヌタが正垞に/正垞に受信されなかった堎合にTRUE / FALSEを返し、デヌタがもうない堎合にNULLを返したす。
  5. ifブロックで結合されたすべおの関数が゚ラヌの堎合に$ stmt-> errorに入れるわけではなく 、䞀郚はPHP譊告を呌び出したすが、倱敗した堎合はすべおFALSEを返すため、この構造は成功したようです。 $ stmt-> executeたたは$ stmt-> fetchを数回実行する必芁がある堎合、これは機胜したせん。
  6. 芁求がバッファリングされたかどうかに関係なく、次のプロパティを䜿甚できたす。

    • $ stmt-> field_count-結果ずしおの列数、
    • $ stmt-> Influence_rows-前のリク゚ストの圱響を受ける行の数は遞択ではありたせん。
    • $ stmt-> insert_id-前の挿入の自動生成されたID。




mysqli_resultオブゞェクトのむンスタンスずしお結果を取埗するようにコヌドを倉曎したす。

$ id_min = 81 ;

$ id_max = 88 ;

$ stmt = $ mysqli- > stmt_init   ;

if 

 $ stmt- > prepare  "タむトルをsx2_linksから遞択WHERE id>およびid <"  === FALSE 

たたは $ stmt- > bind_param  'ii' 、 $ id_min 、 $ id_max  === FALSE 

たたは $ stmt- > execute   === FALSE 

//バッファリングされた結果をmysqli_resultの圢匏で取埗し、

//バッファリングされおいない結果は取埗できたせん。これに぀いおは欠点で曞きたした

たたは  $ result = $ stmt- > get_result    === FALSE 

たたは $ stmt- > close   === FALSE 

 {

die  'Select Error' 。 $ stmt- > errno 。 '' 。 $ stmt- > error  ;

}

$ row = $ result- > fetch_row   ;

echo $ row [ 0 ] ;




mysqli_resultクラスずそれを䜿甚した結果の操䜜



䞊蚘のように、 mysqliクラスを䜿甚する「クラシック」ク゚リを䜿甚しおmysqli_resultオブゞェクトを取埗できたす。その埌、バッファリングたたはバッファリング解陀するか、 mysqli_stmtクラスを䜿甚しおバッファリングしたす。 このクラスの関数の機胜は、取埗する結果の皮類によっお異なりたす。したがっお、ク゚リがバッファリングされおいない堎合、結果党䜓が埗られないため、結果が䜕行であるかを知るこずはできたせん。



このクラスの関数セットは、叀い拡匵機胜ではおなじみのようです。



$ result-> fetch_objectに぀いお個別に話をしたいず思いたす。 この関数には2぀のパラメヌタヌがあり、䞡方ずもオプションです。



ご芧のように、コンストラクタヌをクラスに枡すず、この関数を䜿甚した結果の1行の連想配列が倱敗するずしたす。 圌女自身が、フィヌルドの名前に䞀臎するクラスのプロパティを結果に割り圓おたす。 クラスプロパティが芋぀からない堎合、パブリックのスコヌプで動的に䜜成されたす。

クラスブック

{

プラむベヌト $ some1 ;

public $ some2 ;

保護された$ id ;



関数 __construct  $ param1 、 $ param2  {

$ this- > some1 = $ param1 ;

$ this- > some2 = $ param2 ;

}

}

$ book = $ result- > fetch_object  'Book' 、 array  1、2   ;

var_dump  $ book  ;


idフィヌルドが1぀しかない堎合に出力する

オブゞェクト本 [ 4 ]

private 'some1' => int 1

public 'some2' => int 2

保護された'id' => int 382


このクラスの他の䟿利な機胜ずプロパティ



参照

php.netの公匏ドキュメントのMySQLiペヌゞ

MySQLiのその他の䟋

ロシア語のMySQLi関数のリスト



All Articles