Php MYSQL-如何使用SELECT作为我的WHERE

Php MYSQL-如何使用SELECT作为我的WHERE,php,mysql,select,where-clause,Php,Mysql,Select,Where Clause,我有两个表recordings和recording\u metas,我想选择一些meta并使用这些meta中的外键来查找相应的录制。这就是我目前所拥有的$recording\u sql输出此 SELECT recording FROM recordings INNER JOIN recording_metas ON recordings.id = recording_metas.recording_id WHERE recording_metas.recording_

我有两个表
recordings
recording\u metas
,我想选择一些meta并使用这些meta中的外键来查找相应的录制。这就是我目前所拥有的
$recording\u 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_参数(str_repeat('s',count($mixed)),…$mixed)
我确信
$meta\u sql
是有效的,因为我单独测试了它,限制指针也在那里,所以如果我在
$meta\u 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";
    }
}
function retrieveRecordingsByMetaData($connection、$config、$metas、$limit)
{
$where=“”;
对于($i=0;$imeta\u table WHERE$WHERE中选择录制\u id、meta\u键、meta\u值”;
$recording\u sql=“从$config->recording\u表中选择录制
内部联接$config->meta_表
在$config->recording_table.id=$config->meta_table.recording_id上
其中$config->meta_table.recording_id IN($meta_sql)LIMIT?”;
echo($记录sql);
$stmt=$connection->prepare($recording\u sql);
$mixed=AssociationOaryMixed($metas);
阵列推送($mixed,$limit);
$stmt->bind_参数(str_repeat('s',count($mixed)),…$mixed);
如果(!$stmt->execute()){
echo“执行失败:(“$stmt->errno.”“$stmt->error.”\r\n”;
模具();
}
$result=$stmt->get_result();
如果($result->num_rows>0){
而($row=$result->fetch_assoc()){
回声“发现录音”;
}
}否则{
回显“0结果\r\n”;
}
}

您必须在where子句中只选择一列

WHERE recording_metas.recording_id IN 
  (SELECT recording_id FROM recording_metas WHERE meta_key=? AND meta_value=?) LIMIT ?
如果要选择多个列,必须使用如下所示的元组

您是否尝试
var\u dump($stmt)
?它表明
准备好的语句失败-将逻辑分叉以测试
if($stmt){GOOD}或{BAD}
它输出false,但我如何处理此信息?在
$stmt=$connection->prepare($recording\u sql)之后立即执行此操作所以有点不对劲,实际上用户nbk已经回答了你的问题,select语句必须匹配你的眼睛这是正确的答案,你我的好先生是个聪明人!