2016-07-16 9 views
0

私は昏睡状態がWHEREのsprintf()で句

$emails = “[email protected], [email protected], [email protected]”; 

つまりは私が欲しい

<?php 
function cust_get_oldest_items_all($limit = 1) { 
    $mSearch = new Search(); 
    $result = $mSearch->dao->query(sprintf('SELECT pk_i_id FROM %st_item ORDER BY dt_pub_date LIMIT 0, %d', DB_TABLE_PREFIX, $limit)); 

    return $result->result(); 
} 
?> 

正常に動作怒鳴るPHPコードを持って分離されている電子メールアドレスの数を含む文字列を持っています上記のPHPコードでWHERE句を使用して、s_contact_emailが$ emails内にある項目だけを含めるには?

+0

クエリを作成するために 'sprintf'を使うことは非常にリスクが高く、 。ここに「ダオ」とは何ですか? [エスケープ](http://bobby-tables.com/php)を行うためにそれを使用できますか? – tadman

答えて

1

はあなたの電子メール、このよう操作する:

$emails = "[email protected], [email protected], [email protected]"; 
$emailsArr = explode(",",$emails);//make an array of emails  

//Todo: escape each array item (each email) to prevent SQL injection 

//surround each email with single quotes 
$emailsArr = array_map(function($e){return "'".trim($e)."'";},$emailsArr); 

//join. new string looks like >> ('[email protected]','[email protected]','[email protected]') 
$emails = '('. implode(",",$emailsArr) .')'; 

をまたにあなたのSELECTクエリを変更します

SELECT pk_i_id FROM %st_item 
WHERE s_contact_email IN $emails 
ORDER BY dt_pub_date LIMIT 0, %d 

セキュリティノート

この修正プログラムは動作しますが、それは十分ではありません。各電子メールアドレスを適切にエスケープするか、プリペアドステートメントを使用してDB(SQLインジェクション攻撃)を引き継ぐ攻撃者の攻撃をブロックするか、または

+0

あなたの非常に有用な回答をありがとう、準備された声明をどのように使用できますか?私のためにコードを作れますか? – Syed

+0

私の返信があなたの問題の解決に役立った場合は、私の回答を正しい回答として選択してください。準備されたステートメントについては、サードパーティのツールを使用してDBクエリを作成しているようだから助けにならないのは残念です。しかし、それは本当に大きな話題です。したがって、準備されたステートメントと使用しているツールを検索すると、ヘルプを見つけることができます。がんばろう。 – BeetleJuice

+0

あなたの返信は私を大いに助けました、私は受け入れて、あなたの答えを投票しました。 – Syed