質問
現在の私のコードをサポートに対するコミットメントは、多くのSQLクエリーです。例えば...
// not a real example, but you get the idea...
$results = $db->GetResults("SELECT * FROM sometable WHERE iUser=$userid");
if ($results) {
// Do something
}
私見を格納手続きを低減するのは、そう少しより強固なものをしているのか教えてください懸念..
私のメールが受信できるようにクエリ用のウェブサイトの多くできていることが分かります。いつ、どのように管理すべてのこれらの問合せ時のさまざまな取り組みが認められトコンテキストのコードを使用した結果に保存されている手順にデータベース?
解決
最高のステーションすなたがどのように近づいていのデータアクセス。ありのままに:
- 利用格納手続き
- の問合せコードがすべてのご質問への機能や修正も利用PDOのためのパラメータは、前述のとおり)
- 使用ORMツール
場合に渡したい自分の原SQLデータベースへのエンジンに保管手続きにより、道ばたいへんの原SQLのPHPコードさま、ありがとうございましたので比較的。この保存された手続きvs原SQLの議論は、大聖戦がK.スコットAllenための優れた点も、使い捨てつけの記 バージョン管理データベース:
第二に、保存の手続きいたろった。から帰ってきてWinDNA学校のご指導と保管手続きに使用されます。今回は、参照を格納手続きとしてAPI層のデータベースです。これは良いが必要な場合はAPI層データベースレベルで、数多くの用途負担しのオーバーヘッドの作成と維持を追加API層ん。にアプリケーションに格納手続き以上に負担します。
してしまいがちな傾向を利用しない保存の手続き働いてきたプロジェクトのDBは、APIに晒されて保存方法で保管手続きを与える可能性があ制限ちは自分たちのプロジェクトのい すべての, して、程度の違いはあるが、動的に生成され、原SQLコードにアクセスのDBです。
を有するAPI層のDBをより確間DBのチームとDevチームの費用の一部の柔軟ない場合、またはクエリータ保管したコードはPHPプロジェクトがて大きなチームによる領域.
概念的には、だいだろうデータベース番号.具体的には、しかし、いかがでコード番号よりごしてデータベース番号.だが変化するお問合の変更コードは、そのままのクエリに格納手続き保存データベースに対するそうなチェックの方はチェックイン時にお、コードではなく多くのバージョン管理のための重要な領域のご使用をご検討ください。
るか否かにかかわらずご選択を使用しない保存の手続きが、少なくとも各データベース操作が格納され独立した機能により、組み込みそれぞれのページのスクリプト-基本的にAPI層のごDBを維持し、番号をごのコードです。使用している場合は、保存の手続き、これに効果的と思う二つのAPI層のごDBのコードは、一つのDBを感じる場合があり不必要に複雑なものにい場合はプロジェクトがない別々のチームあります。もちろんです。
場合にはコードをォあるというものですコードSQLの詰まった、より客様のUserManagerクラスを以下に示を開始-クラスのみを含むクエリに関連する'ユーザ'テーブル、クエリは、独自の方法は、クラスのクエリがインデントに備えて諸表形式という形式にて保存されている。
// UserManager.php:
class UserManager
{
function getUsers()
{
$pdo = new PDO(...);
$stmt = $pdo->prepare('
SELECT u.userId as id,
u.userName,
g.groupId,
g.groupName
FROM user u
INNER JOIN group g
ON u.groupId = g.groupId
ORDER BY u.userName, g.groupName
');
// iterate over result and prepare return value
}
function getUser($id) {
// db code here
}
}
// index.php:
require_once("UserManager.php");
$um = new UserManager;
$users = $um->getUsers();
foreach ($users as $user) echo $user['name'];
ただし、お問合せの多くは似通って対応いたしますが膨大な数の組み合にもエラー条件の複雑なページング、仕分け、フィルタリングなど、オブジェクトまたは関連マッパーツールのある方は、工程の見直し既存のコードを利用するツールできる非常に複雑です。
する場合には、その結果生じる調査ORMツールしておくとよいでしょうで を推進, のActiveRecord成 Yii, 又は、キング-パPHP ORM, 義.それぞれまた、柔軟性と使い勝手を重視するプログラムの構築をクエリデータベースに複雑なロジック主義の行を表示可能なテンプレートデータベースの 入れ子の設定ツリーにパターン 箱の中から外へ出た。
性能面では、保存の手続き最も速いものの、一般的にはよく上原sql.ORMツールで重要なパフォーマンスへの影響の方-非効率なまたは冗長照会は、巨大なファイルのIO読み込み中のドライブラリの申請ごとに、動的SQLを発生各クエ---これらすべてのものは影響するのですが、ご使用になORMツールで大幅に増加の電力をまりはるかに小さなコードを作成するDB層マニュアルます。
ゲーリー-リチャードソン であって、それが絶対的に正しいものであれば引き続き利用のSQLコードしなければなりません使用PDOの諸表作成のパラメータの設置の有無にかかわらずいクエリに対し又は保存されている。のsanitisationの入力を行いまPDO.
// optional
$attrs = array(PDO::ATTR_PERSISTENT => true);
// create the PDO object
$pdo = new PDO("mysql:host=localhost;dbname=test", "user", "pass", $attrs);
// also optional, but it makes PDO raise exceptions instead of
// PHP errors which are far more useful for debugging
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$stmt = $pdo->prepare('INSERT INTO venue(venueName, regionId) VALUES(:venueName, :regionId)');
$stmt->bindValue(":venueName", "test");
$stmt->bindValue(":regionId", 1);
$stmt->execute();
$lastInsertId = $pdo->lastInsertId();
var_dump($lastInsertId);
警告:このIDは1、上記のスクリプトを出力します string(1) "1"
. PDO->lastInsertId()
IDを返します文字列かどうかにかかわらず実際のカラムは整数です。こされることがないでしょう問題としてPHPを行い鋳物の文字列は整数に動きます。
以下の出力は、このようになります bool(true)
:
// regular equality test
var_dump($lastInsertId == 1);
だいコードで期待する値を整数のように、 is_int PHPの "は、真には、100%に等しい" オペレーター:
var_dump(is_int($lastInsertId));
var_dump($lastInsertId === 1);
きパッチの問題です。
編集: いくつかの良い議論を格納手続き こちらの
他のヒント
まず最初に、ものを使用できるプレースホルダーにクエリの代わりに変数を挿ます。PDO/MySQLiできるお書きの上質問など:
SELECT * FROM sometable WHERE iUser = ?
このAPIを安全に代替の値を返します。
もみじみの私の質問のコードの代わりに、データベースです。経験してきた中でも作業がしやすくなり、RCSの問合せにはおのコードです。
していま験則がORMの:ばん一つである者、また利用したいと思い、インターフェース。について知っておきましょ報告のない/報告と記録集計し、通常の書きSQL文のことを思い出します。これが非常に少数の質問を私のコードです。
た多種多様化するライフスタイルプロジェクトが既に多くの取し、ダイオキシン類をはじめと/と同様)クエリriddledインジェクション脆弱性があります。初めの何段階かったプレースホルダとラベル毎にクエリのオブジェクトまたは方法およびソース-ラインのクエリの作成を行った。(挿入するPHP-定数 方法 や ライン へのSQLコメント-ライン)
で見て思ったこと。
--@線:151UserClass::getuser():
SELECT * FROM USERS;
ログインのすべての問い合わせに対応短時間の供給を招聘したいと思ってい開始ポイントをクエリする必要がありません。(場!)
いすべて移動するSQLを別途必要とするPerlモジュール(.pm)多くの質問が再利用と同じ機能をわずかに異なるパラメータ。
共通の間違い開発者は潜ORM図書館、parametrizedお問い合わせ保存の手続きその作業のための行のコード"より良い"もの"より良いもの"開発の一種です。んな新しいチームを作りあげよう。
使用複雑なコードでのみお客様のニーズに合.
使用ORMパッケージには、他の半分にもパッケージできます
- 取得単純な結果セット
- く複雑なSQLのデータモデル
場合は非常に複雑なSQLでは、その景色も素敵であることと、商用アニメーションに異なる層のご使用をご検討ください。
また同様の苦境です。お問い合わせ特定のテーブルは、次のようなさまざまな方法で50+.
何をして単一のフェッチ保存の手順を含むパラメータ値のWhereClause.のWhereClauseによって建設されたプロバイダオブジェクトを採用したファサードデザインパターンとして スクラブ そのSQLインジェクション攻撃であった。
などの保守が簡単で変更.SQLサーバーのもの 植物 およびキャッシュを実行計画の動的なクエリーなので、全体の性能が良いと思います。
しょうかを判断しなくてはいけを 性能 欠点に基づく独自のシステムニーズはすべて、この作品 非常に ます。
があり、図書館などのMDB2梨する照会は少や安全性の向上を目指します。
残念ながら、彼られるビットすることができますが語に絶を設定することがありうに同じ情報。に使用しましたMDB2カップルのプロジェクトかが書き薄板ので、特に指定の種類。私は、オブジェクトについて知っている特定のテーブルと列数、およびそのヘルパーの機能を埋める分野の種類んを呼MDB2クエリ機能です。
たとえば、次のようになります。
function MakeTableTypes($TableName, $FieldNames)
{
$Types = array();
foreach ($FieldNames as $FieldName => $FieldValue)
{
$Types[] = $this->Tables[$TableName]['schema'][$FieldName]['type'];
}
return $Types;
}
このように、オブジェクトが地図上のテーブル名->のシステムの主要なテーマで知、抽出物の種類を指定し、このマッチングタイプ配列の使用に適しています。るMDB2を返します。
MDB2(同図書館のその後のパラメータの代わりに、アップデート/クエリーを挿入し、あなただけの構築のハッシュ/地図からカラム名を使用autoExecute機能の構築と実行に関連するクエリ。
例えば:
function UpdateArticle($Article)
{
$Types = $this->MakeTableTypes($table_name, $Article);
$res = $this->MDB2->extended->autoExecute($table_name,
$Article,
MDB2_AUTOQUERY_UPDATE,
'id = '.$this->MDB2->quote($Article['id'], 'integer'),
$Types);
}
とMDB2のままのクエリー、脱出も適切に。
されています。測定性能MDB2ものの、そのまま取り込むイベントカレンダーのコードを引き起こす可能性のあるまれなければなりがちだし、PHPの加速器となります。
という設定は架空のような厳しいので、もう一度入力して完了ですの質問できるよ/りを象徴す(特に)変更.と思いMDB2知るべきかにつスキーマ、simpifyも一般的に使用されるAPIコールで低減することができます。迷惑するような封止のスキーマ、自分にとっては、前述のとおり、簡単にアクセス用メソッド機能するとともに、配列MDB2のニーズを行います。
もちろんできるだけでな平坦なSQLクエリー文字列としてのクエリ()関数にしたい場合は、いまだ強制的に切り替える'MDB2うにできるように片とさせていただき嫌いでいます。
このその他の質問 また、いくつかの有用なリンクで...
使用ORMの枠組みのようにQCodoできる地図、既存のデータベース
写真撮影のポイントにご案内してかなり一般の機能だけでは違います。このようにただ一機能のほとんどのデータベースを選択します。明らかに作成できます他の機能を取扱う全ての挿入を行います。
例えば.
function getFromDB($table, $wherefield=null, $whereval=null, $orderby=null) {
if($wherefield != null) {
$q = "SELECT * FROM $table WHERE $wherefield = '$whereval'";
} else {
$q = "SELECT * FROM $table";
}
if($orderby != null) {
$q .= " ORDER BY ".$orderby;
}
$result = mysql_query($q)) or die("ERROR: ".mysql_error());
while($row = mysql_fetch_assoc($result)) {
$records[] = $row;
}
return $records;
}
今の私の頭でご利用いただけます。いかねます。利用での機能に必要なパラメータ:
例えば.
$blogposts = getFromDB('myblog', 'author', 'Lewis', 'date DESC');
この場合に $blogposts する配列の配列は、各行のとする。そしてご利用いただけるはforeachをご参照の配列を直接:
echo $blogposts[0]['title'];