PHP + SQL初心者向け:プログラミングのレベルを上げます。

この記事は純粋に実用的であり、SQLデータベースを操作するときにPHPでプログラミングのレベルを上げる方法についてのみ触れています(将来、プログラミングの他の側面に触れることを試みます)。 高レベルは、コンピューティングリソースの効率的な使用を損なうとしても、最小限の迅速に受信したコード(コードの行数、1行あたりの文字数)で目標を達成すると理解されます。



現在、プロセッサ時間、メモリ、およびディスクスペースは、エンジニアリング担当者の作業時間と比較して非常に安価であるため、無視することができます。 アプリケーション開発の速度は、それがどれほど効率的に機能するかよりもはるかに重要です。 開発者が30行のコードではなく10行のみを記述した場合、エラーの可能性は3倍減少します。 短いコードのさらなるメンテナンスと修正も、間違いなく、より少ない時間と人的資源を必要とします。 コードの効率が最重要である場合、ここではシステムソリューションを考慮しないことを忘れないでください。



この記事では、標準のmysql PHPライブラリのラッパーを作成します。 自分で他のデータベースに適合させることは難しくありません。 これはORMを作成する試みではありません。 ORMには、プログラミングのレベルを上げてコードを削減するという目標に反する、まったく異なるタスクがあります。



実用的な例として、次の構造のユーザーデータの架空のテーブルを使用します。



CREATE TABLEユーザー(

id int auto_increment、

カテゴリtinyint、

名前varchar (25)、

パスワードchar (32)、

メールvarchar (100)

);





テーブルからデータを取得する通常の方法は次のようになることを思い出してください。



$ result = mysql_query( "SELECT * FROM users" );

$ users = array();

while ($ row = mysql_fetch_array($ result))

{

$ユーザー[] = $行;

}




時々繰り返されるこのような5-6行の設計は、よりコンパクトなものに置き換えることができる(そしてそうすべきである!)ことを教えてくれます。 ループ内で、配列を単に蓄積するよりも実際にいくつかの便利なアクションを実行できることは明らかです。 ここで、高度なプログラミングパラダイムが施行されます。これは、データベースリソースから結果を取得して使用するなど、そのようなシステムアクションに混ぜてはならないことを意味します。 $ users配列なしでも実行できる場合は、それを取得して、既にアプリケーションモードで作業する必要があります。



新しい関数を導入します:



$users = sql_get_rows("SELECT * FROM users");









まあ、それだけです。 5〜6行のコードは、まだ読んで理解する必要があり、何をしているのかが、明確で理解しやすい1行に置き換えられています。 この例はもちろん純粋にアカデミックであり、実際には得られた結果を何らかの形で改良することがしばしば必要です。 たとえば、指定されたIDの行に直接アクセスしたいと思います。 適切な$ユーザー['id']を探して配列を精査することも完全に正しいわけではありません。 これを思いついた:



$users = sql_get_rows("SELECT * FROM users", 'id');









これで、$ users配列では、インデックスは数字の順序だけでなく、このユーザーのIDに対応しています。 さらに進んで、多次元、または言うまでもなくツリー配列を提供しました。 たとえば、すべてのユーザーをリストする必要がありますが、それらをカテゴリにグループ化します。 お願い:



$users = sql_get_rows("SELECT * FROM users", 'category', 'id');









次に、特殊なケースを検討します。 たとえば、結果として常に1行になることを知っています。 ここで別の機能を提供します:



$user = sql_get_row("SELECT * FROM users WHERE id=$id");









なぜ別の機能。 まあ、まず、どこかでコードの効率を不注意に高めることができるなら、それはなぜですか。 しかし、これはポイントではありません。 主なことは、結果が1行であることを明確に確認した後にこのコードを読む人です。 ところで、関数自体は常に「LIMIT 1」を最後に追加します。

さて、別の縮退関数:



$qty = sql_get_value("SELECT count(*) FROM users");









ご理解のとおり、単一のスカラー値を返します。



結果を返さない他のクエリについては、次の関数を提供しています。



$id = sql_query("INSERT INTO users ...");

$qty = sql_query("DELETE FROM users WHERE email='' ");









実際に結果も返すことに注意してください。非常に便利です。 INSERTの場合、auto_incrementコードが返されます。 DELETEおよびUPDATEの場合、処理された行の数。 上記の例の省略記号のギャップを埋めるだけです。 理解できるように、フィールドを埋めるデータがあるはずです。



規則を導入します。データは常に連想配列の形式で、他の形式ではありません。 私を信じて、それは常により便利で柔軟です。 たとえば、テーブルから行を読み取ります。 連想配列として提供されます。 単一の値を置き換え、いくつかのフィールド(例: 'id')を削除して、配列をUPDATEまたはINSERTに戻します。 とても効果的です。 テーブル内のフィールドの数が増えた場合、実際にはコードをどこでも修正する必要はありません。



もう1つの補助機能を紹介します。



$set = sql_set($fields);

$id = sql_query("INSERT INTO users $set");









sql_set()関数がフィールドとデータのリストでSETオプションを生成することを推測するのは難しくありません:SET name = 'Vasya'、password = '56F54AC84'、email = 'vasya @ pupkin.com'



したがって、いくつかの高レベル関数を導入することにより、プログラムのレベルを上げました。 データベースの操作を担当するコードの長さは約5〜7倍短縮されましたが、最も重要なことは、コードの可読性とその意味の純度が向上したことです。 通常のアプリケーション(つまり、99%のケース)では、低レベルの関数にアクセスする必要がなくなります。 これらの機能は、ほとんどすべてのアプリケーションを解決するのに十分です。

結論として、ライブラリのテキストを提供します(利点は非常に短いです)。 好奇心reader盛な読者は、記事に記載されていない有用なものをいくつか見つけるでしょう。 ライブラリはerror_reporting(E_ALL ^ E_NOTICE)で記述されていることを警告します。 その理由は、プログラミングの改善に関する別の記事のトピックです。 しかし、誰でもこのライブラリのすべてを好きなように自由に変更できます。



// ================================================= ==========

関数sql_get_rows($クエリ、$ key_col = false 、$ key_col2 = false

{

$ array = array();

$ res = sql_query($ query);

if (mysql_num_rows($ res)> 0)

{

if ($ key_col)

{

if ($ key_col2) while ($ item = mysql_fetch_assoc($ res))$ array [$ item [$ key_col]] [$ item [$ key_col2]] = $ item;

else while ($ item = mysql_fetch_assoc($ res))$ array [$ item [$ key_col]] = $ item;

}

else while ($ item = mysql_fetch_assoc($ res))$ array [] = $ item;

}

mysql_free_result($ res);

$配列を返します。

}

// ================================================= ==========

関数sql_get_row($クエリ)

{

$ res = sql_query($ query。 'LIMIT 1' );

$ array = mysql_fetch_assoc($ res);

mysql_free_result($ res);

$配列を返します。

}

// ================================================= ==========

関数sql_get_value($クエリ)

{

$ res = sql_query($ query);

$ array = mysql_fetch_row($ res);

mysql_free_result($ res);

return $ array [0];

}

// ================================================= ==========

関数sql_query($クエリ)

{

mysql_query($ query)またはsql_query_die(mysql_error()、$ query);

if (substr($ query、0.6)== 'INSERT' )$ res = mysql_insert_id();

if (!$ res)$ res = mysql_affected_rows();

$ resを返します。

}

// ================================================= ==========

関数sql_set($データ、$ skipslashes = false

{

sql_protect($データ);

$ set_text = '' ;

foreach ($ col => $ val としての $データ)

{

if (!$ skipslashes)$ val = addslashes($ val);

$ set_text。= "、` $ col` = '$ val' " ;

}

$ set_text = substr($ set_text、1); //最初のコンマを削除します

return 'SET' 。$ set_text;

}

// ================================================= ==========

関数sql_query_die($エラー、$クエリ)

{

$ backtrace = debug_backtrace();

foreach ($ backtrace as $ step => $ trace) if (substr($ trace [ 'function' ]、0.4)!= 'sql_'break ;

$ステップ-;

die( "SQL:$ error。Generated at:{$ backtrace [$ step] ['file']}:{$ backtrace [$ step] ['line']} \ nFull query: '$ query'" );

}

*このソースコードは、 ソースコードハイライターで強調表示されました。



All Articles