2011-01-14 16 views
0

私はカテゴリシステムのCMSを作りたいと思っています。大きな問題を除いて、すべてが問題ありません。 = SMT & anotherInput =キーPHPパターン - このコードを書くにはどうすればいいですか?

から

site.com/some-category & SORTBY =ビュー&:私はハンドルとmysqlのクエリを生成することができますすることができますどのように

は、のようないくつかの入力によって異なり

たとえば、この入力では、クエリは次のようになります。

SELECT * FROM `articles` WHERE from='smt' AND afield='key' ORDER BY VIEWS 

Bこれらの入力は異なるでしょう。私はこのコードをどのように書くことができますか?私はデザインパターンについて多くのことを知らないが、工場パターンについて聞いたことがありますが、これは私の解決策の一部ですか?

than

+0

これは基本的なPHPフォームの処理です –

答えて

1

ファクトリパターンはあなたに役立ちます。コード全体を書き換えなくても、さまざまなデータベースを接続/照会できます。これはクエリ自体について何もしません。

あなたはPDOの拡張子を見ることができます。私は通常、準備された文とともに使用します。 それはあなたがこのようなクエリを記述できるようになる:

$prepare = $db->prepare(' 
    SELECT 
     * 
    FROM 
     articles 
    WHERE 
     from=:from AND afield=:afield 
    ORDER BY 
     views 
'); 

$prepare->bindValue(':from', $_GET['from'], PDO::PARAM_STR); 
$prepare->bindValue(':afield', $_GET['afield'], PDO::PARAM_STR); 

$prepare->execute(); 

return $prepare; 

それの良いところは、PDOがあなたのためにそれを作るとして、あなたがSQLインジェクションからこれを保護する必要がないことです。また、クエリはキャッシュされ、異なるパラメータで数回実行できます。

+0

+1 PDO。 mysql_ *よりも絶対にお勧めします。 – mfonda

-1

これはパターンとは関係ありません。 $_GET超大域変数を使用して、クエリ文字列を動的に生成します。

$query = "SELECT * FROM articles WHERE from='". 
     $_GET['from']. 
     "' AND afield='". 
     $_GET['anotherInput']. 
     "' ORDER BY ". 
     $_GET['sortby']; 

免責事項:これは、SQLインジェクションになりやすいです。以下のような運用環境でエスケープ入力し、準備された文、元PDOを使用します。直接クエリで生のGETのparamsを使用する

$query = "SELECT * FROM articles WHERE from='?' AND afield='?' ORDER BY ?"; 
$clean_from = htmlentities($_POST['from'], ENT_QUOTES, 'UTF-8'); 
$clean_anotherInput = htmlentities($_POST['anotherInput'], ENT_QUOTES, 'UTF-8'); 
$clean_sortby = htmlentities($_POST['sortby'], ENT_QUOTES, 'UTF-8'); 
$clean_inputs = array($clean_from, $clean_anotherInput, $clean_sortby); 

$sth = $dbh->prepare($query); 
$sth->execute($clean_inputs); 
+0

私は$ _GETの使用について知っていますが、ここでは問題はありません。しかし、私はどのように私はこれらの入力によってクエリを生成することができますかわからない。たとえば、sortby = viewsの場合、ビューで記事を注文する必要があります。そうでなければ、IDで注文する必要があり、例を続けることができます。 –

+0

しかし、このコードはSQLインジェクションを受けやすいので注意してください。 $ _GETから読み込まれたものは安全ではないとみなされ、この場合は一重引用符で囲まれたものを渡すとこのクエリが中断されます。 – Matt

+0

http://en.wikipedia.org/wiki/SQL_injectionに気をつけてください – joksnet

0

非常に悪い習慣、あなたがFROM

SELECT *のような構造を作るべきではない、すなわち、 ($ _GET ['from'] == 'smt')$ from = 'smt'

のようなものではなく、 のようなものです。

SELECT * from from '' from 'AND afield =' key 'ORDER BY VIEWS

など

P.S.キーワードは「SQLインジェクション」です

0

あなたは何が必要に応じて、作品としてのクエリ文字列を構築することができます。

$query = "SELECT * FROM `articles` WHERE 1 = 1"; 

$where = '' 

if (isset($_GET['from'])) { 
    $where .= " AND `from` = '" . mysql_real_escape_string($_GET['from']) . "'" 
} 

if (isset($_GET['anotherInput'])) { 
    $where .= " AND `from` = '" . mysql_real_escape_string($_GET['anotherInput']) . "'" 
} 

if (isset($_GET['sortby'] == 'views') { 
    $orderby = " ORDER BY `views` DESC" 
} else { 
    $orderby = " ORDER BY `id` DESC" 
} 

$query = $query . $where . $orderby; 

$result = mysql_query($query); 

これはストレートPHP/MySQLの方法の一種ですが、私は実際にあなたがパベルドビニンののように準備されたステートメントを使用することをお勧めします回答。

関連する問題