【发布时间】:2020-03-30 19:36:04
【问题描述】:
我有两个表recordings 和recording_metas,我想选择一些元数据并使用这些元数据中的外键来查找相应的记录。这就是我到目前为止所拥有的。 $recording_sql 输出这个
SELECT recording FROM recordings
INNER JOIN recording_metas
ON recordings.id = recording_metas.recording_id
WHERE recording_metas.recording_id IN (SELECT recording_id, meta_key, meta_value FROM recording_metas WHERE meta_key=? AND meta_value=?) LIMIT ?
但为什么会出现以下错误?
Fatal error: Uncaught Error: Call to a member function bind_param() on bool
在$stmt->bind_param(str_repeat('s', count($mixed)), ...$mixed); 这一行,我确信$meta_sql 可以工作,因为我也用其中的 LIMIT 指针单独测试了它,所以如果我在$meta_sql 上使用它们,这些指针工作正常
PHP
function retrieveRecordingsByMetaData($connection, $config, $metas, $limit)
{
$where = "";
for ($i = 0; $i < count($metas); $i++) {
$where .= "meta_key=? AND meta_value=? AND ";
}
$where = preg_replace('/ AND $/', '', $where);
$meta_sql = "SELECT recording_id, meta_key, meta_value FROM $config->meta_table WHERE $where";
$recording_sql = "SELECT recording FROM $config->recording_table
INNER JOIN $config->meta_table
ON $config->recording_table.id = $config->meta_table.recording_id
WHERE $config->meta_table.recording_id IN ($meta_sql) LIMIT ?";
echo ($recording_sql);
$stmt = $connection->prepare($recording_sql);
$mixed = associativeToArrayMixed($metas);
array_push($mixed, $limit);
$stmt->bind_param(str_repeat('s', count($mixed)), ...$mixed);
if (!$stmt->execute()) {
echo "Execute failed: (" . $stmt->errno . ") " . $stmt->error . " \r\n";
die();
}
$result = $stmt->get_result();
if ($result->num_rows > 0) {
while ($row = $result->fetch_assoc()) {
echo "recording found";
}
} else {
echo "0 results \r\n";
}
}
【问题讨论】:
-
你试过
var_dump($stmt)吗? -
这表明
prepared statement失败 - fork 逻辑以测试if ( $stmt ){GOOD} else{BAD} -
它输出错误,但我该如何处理这些信息?
-
在
$stmt = $connection->prepare($recording_sql);之后马上做 -
所以出了点问题,实际上用户 nbk 已经回复了您遇到的问题,select 语句必须与您的 where 子句匹配
标签: php mysql select where-clause