0

配列に含まれる識別子に基づいて MYSQL データベースからレコードを取得しようとしています。識別子を取得するには、私のコードは次のとおりです。

$query="SELECT agent_id FROM agent_coverage WHERE primary_area LIKE '$search_term%'";
$result=mysqli_query($dbc, $query) or die("Could not obtain primary area coverage2");
while($r=mysqli_fetch_array($result))
{
    $agent_primary[]=$r['agent_id'];
}

print_rを使用して配列の詳細にアクセスする場合、これは正常に機能するようです。

失敗する次のステートメントは次のとおりです。

if(!empty($agent_primary))
{
    $ids=join(",", $agent_primary);
    $query5="SELECT * FROM detail_db WHERE user_id IN($ids)";
    $result5=mysqli_query($dbc, $query5) or die("Could not do SELECT");

    while($row=mysqli_fetch_array($result5))
    {
    //do stuff with results here.
    }
}

これはdie()ステートメントを起動するだけです。implode代わりに使用してみましたがjoin、成功しませんでした。

編集:
die($dbc->error)失敗したクエリが次のエラーを明らかにした後:unknown column '' in where clause

4

6 に答える 6

1

試す:

$agent_primary[]="'".$dbc->real_escape_string($r['agent_id'])."'";
于 2013-02-07T12:00:15.580 に答える
0

あなたはこのようにすることができます

if(!empty($agent_primary))
{
    $ids=implode($agent_primary,",");
    $query5="SELECT * FROM detail_db WHERE user_id IN ($ids)";
    $result5=mysqli_query($dbc, $query5) or die("Could not do SELECT");

    while($row=mysqli_fetch_array($result5))
    {
    //do stuff with results here.
    }
}

お役に立てれば

于 2013-02-07T11:50:48.270 に答える
0

implode を使用して文字列を作成し、その周りに括弧を追加します。

配列内の ID の値を取得し、それを内破します。以下の例を参照してください - これは機能します。

 $arr = array(1,297,298);
    $new = '(';
    $new .= implode(',',$arr);
    $new .= ')';
    $query = "Select * from wp_posts where ID IN $new";
于 2013-02-07T11:46:13.547 に答える
0

これを試して

 $ids=join("','", $agent_primary);
 $query5="SELECT * FROM detail_db WHERE user_id IN('$ids')";

私は自分のローカルホストで試してみましたが、完璧に動作します!

于 2013-02-07T12:48:50.710 に答える
0
$query="SELECT agent_id FROM agent_coverage WHERE primary_area LIKE '$search_term%'";
$result=mysqli_query($dbc, $query) or die("Could not obtain primary area coverage2");

$agent_primary=array();    

while($r=mysqli_fetch_array($result))
{
  array_push($agent_primary,$r['agent_id']);
}

それから

if(!empty($agent_primary))
{
$ids=$agent_primary;
$query5="SELECT * FROM detail_db WHERE user_id IN($ids)";
$result5=mysqli_query($dbc, $query5) or die("Could not do SELECT");

while($row=mysqli_fetch_array($result5))
{
//do stuff with results here.
}
}

これを使って。役立つと思います。

于 2013-02-07T11:33:04.700 に答える
0

編集: 両方のクエリを JOIN ステートメントと組み合わせることができます

$query = "
    SELECT
        dd.user_id,
        dd.foo
    FROM
        tmp_agent_coverage as ac
    LEFT JOIN
        tmp_detail_db as dd
    ON
        ac.agent_id=dd.user_id
    WHERE
        ac.primary_area LIKE '$search_term%'
";
$result=mysqli_query($dbc, $query) or mysqliError($dbc, "Could not obtain primary area coverage2");
while($r=mysqli_fetch_array($result))
{
    echo $r['user_id'], ' ', $r['foo'], "\n";
}

edit2: 自己完結型の例

<?php
$dbc = new mysqli('localhost', 'localonly', 'localonly', 'test');
if ($dbc->connect_error) {
    var_dump($mysqli->connect_errno, $mysqli->connect_error);
    die;
}
setup($dbc);
$search_term = 'xy';

$query = "
    SELECT
        dd.user_id,
        dd.foo
    FROM
        tmp_agent_coverage as ac
    LEFT JOIN
        tmp_detail_db as dd
    ON
        ac.agent_id=dd.user_id
    WHERE
        ac.primary_area LIKE '$search_term%'
";
$result=mysqli_query($dbc, $query) or mysqliError($dbc, "Could not obtain primary area coverage2");
while($r=mysqli_fetch_array($result))
{
    echo $r['user_id'], ' ', $r['foo'], "\n";
}

define('DEVELOPMENT_DEBUG_MESSAGES', 1);
function mysqliError($dbc, $description) {
    if ( !defined('DEVELOPMENT_DEBUG_MESSAGES') || !DEVELOPMENT_DEBUG_MESSAGES ) {
        echo '<div class="error">', htmlspecialchars($description), '</div>';
    }
    else {
        echo '<fieldset class="error"><legend>', htmlspecialchars($description), '</legend>',
            htmlspecialchars($dbc->error), '</div>';
    }
}

function setup($dbc) {
    $q = array(
        'CREATE TEMPORARY TABLE tmp_agent_coverage (
            agent_id int auto_increment,
            primary_area varchar(32),
            primary key(agent_id),
            key(primary_area)
        )',
        "INSERT INTO tmp_agent_coverage (primary_area) VALUES ('xy1'),('dfg'),('xy2'),('abc'),('xy3')",
        'CREATE TEMPORARY TABLE tmp_detail_db (
            user_id int auto_increment,
            foo varchar(32),
            primary key(user_id)
        )',
        "INSERT INTO tmp_detail_db (foo) VALUES ('fooxy1'),('foodfg'),('fooxy2'),('fooabc'),('fooxy3')"
    );
    foreach($q as $query) {
        $dbc->query($query) or die(__LINE__ .' '.$query. ' '. $dbc->error);
    }
}

版画

1 fooxy1
3 fooxy2
5 fooxy3

元の回答:
mysqli::queryfalse を返すことは、クエリの実行中にエラーが発生したことを意味します。たとえば、構文エラー、権限、または ... または ... $dbc オブジェクト
errorおよびerrnoプロパティは、エラーに関するより詳細な情報を保持する必要があります。ただし、任意のユーザーだけに完全なエラー メッセージを表示するべきではありません。
したがって、デバッグ目的で次のような関数を定義します

define('DEVELOPMENT_DEBUG_MESSAGES', 1);
function mysqliError($dbc, $description) {
    if ( !defined('DEVELOPMENT_DEBUG_MESSAGES') || !DEVELOPMENT_DEBUG_MESSAGES ) {
        echo '<div class="error">', htmlspecialchars($description), '</div>';
    }
    else {
        echo '<fieldset class="error"><legend>', htmlspecialchars($description), '</legend>',
            htmlspecialchars($dbc->error), '</div>';
    }
}

そして、この関数をコードで次のように使用します

<?php
define('DEVELOPMENT_DEBUG_MESSAGES', 1);
[...]
$query="SELECT agent_id FROM agent_coverage WHERE primary_area LIKE '$search_term%'";
$result=mysqli_query($dbc, $query) or mysqliError($dbc, "Could not obtain primary area coverage2");

define(...)デバッグが完了したら、この行を削除してください。

于 2013-02-07T11:48:31.933 に答える