編集: 両方のクエリを 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::query
false を返すことは、クエリの実行中にエラーが発生したことを意味します。たとえば、構文エラー、権限、または ... または ... $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(...)
デバッグが完了したら、この行を削除してください。