1

さて、私はこのようなMysqlテーブル(oc_calendar)を持っています:

id      start_date         username
1       2013-04-04         18
2       2013-03-31         19
3       2013-04-04         19
4       2013-04-02         19 
5       2013-04-03         18

次のクエリを使用すると、検索結果に基づいてすべてのIDを取得できます。

$search = mysql_query("SELECT DISTINCT username FROM oc_calendar WHERE start_date 
between '$from' AND '$to'");

while($re_search = mysql_fetch_array($search)) {

$search_p_id = $re_search['username']; // here is the result Like: 18, 19 etc..
}   

次のクエリで変数$search_p_idに基づいて別のtable( property_step1 )情報を取得しようとしていますが、エラーが表示されます。私の質問が正しくない可能性があります。

注:変数$ search_p_idは、18または19、18などにすることができます。

$search = mysql_query("SELECT * FROM property_step1 WHERE propertyid IN (" . 
implode(',', $search_p_id) . ")"); 

エラーメッセージが表示されるのはなぜですか、Any Idea?

4

4 に答える 4

5

JOIN2つのクエリは必要ありません。これは、2つのテーブルを使用することで1つのクエリで実行できます。

SELECT p.* 
FROM oc_calendar AS o
INNER JOIN  property_step1 AS p ON o.username = p.propertyid
WHERE o.start_date between '$from' AND '$to';

結合条件を想定しました。最初のテーブルから値o.username = p.propertyidのリストを取得するため、述語を使用して最初のテーブルから選択された値のリストでusername、2番目の値からすべての行を選択します。それで、私はそれを述語のように使用しましたが、より安全であり、両方のテーブルから列を選択できるようにしました。propertyidusernameINJOININ


注: *拡張機能の使用を停止してくださいMysql_。この方法のコードはSQLインジェクションに公開されており、非推奨になっています。代わりに、 PDOまたはプリペアドステートメントを使用してください。

于 2013-03-16T05:51:24.033 に答える
2

implode()非配列データには使用できません。$search_p_idvalueの値を配列として変更する必要があります。

$search = mysql_query("SELECT DISTINCT username FROM oc_calendar WHERE start_date between '$from' AND '$to'");
$search_p_id = array();

while($re_search = mysql_fetch_array($search)) {
    $search_p_id []= $re_search['username']; // here is the result Like: 18, 19 etc..
}

$search = mysql_query("SELECT * FROM property_step1 WHERE propertyid IN (" . implode(',', $search_p_id) . ")"); 
于 2013-03-16T05:52:58.957 に答える
1

$search_p_id現在は配列ではないため、implode(',', $search_p_id)失敗している可能性があります。

設定方法を変更する$search_p_id

while($re_search = mysql_fetch_array($search)) {
  $search_p_id[] = $re_search['username']; // here is the result Like: 18, 19 etc..
}   
于 2013-03-16T05:51:41.707 に答える
1

最初に非推奨のmysqlapiを使用している場合は、Mahmoudが言うようにpdoに切り替えます。

次に、非配列の$ search_p_idでimplode関数を使用しているため、望ましくない結果が生じる可能性があります。代わりに次を試してください。

$search = mysql_query("SELECT DISTINCT username FROM oc_calendar WHERE start_date 
between '$from' AND '$to'");
$search_p_id = array();
while($re_search = mysql_fetch_array($search)) {
   array_push($search_p_id, $re_search['username']);
}   

search = mysql_query("SELECT * FROM property_step1 WHERE propertyid IN (" . 
implode(',', $search_p_id) . ")"); 
于 2013-03-16T05:53:59.547 に答える