0

编辑: 为了澄清,我使用 PDO 到 MySQL 数据库

好的,我的查询有一点问题。我试过谷歌搜索和'stackoverflowing',但无济于事。我正在尝试从名为download store的表中选择所有记录,其中 ownerid = '1'

//Partial code
 $sql="SELECT * FROM boughtdownloads WHERE ownerid=:userid";
 $prep=$GlobalDB->prepare($sql);
 $prep->bindParam(':userid',$userid,PDO::PARAM_INT);
 $prep->execute();
 if($prep->rowCount()=='0')
 {
   return 'Error with get owned IDS';
 }
 else
 {
   foreach($prep->fetchAll()as $res)
   {
      $owned[]=$res['fileid'];
   }
    $owned=implode(",",$owned);
    return $owned;
 }

按预期工作,返回1,2

$OwnedIDS=$this->GetOwnedIDS($userid); // The same code as above ^
//This query doesn't work, even with the following:
//$OwnedIDS="1,2"; //Which is what's expected, and returned, from the above
$sql="SELECT * FROM downloadstore WHERE fileid IN (:owned)";
$prep=$GlobalDB->prepare($sql);
$prep->bindParam(':owned',$OwnedIDS);
$prep->execute();
if($prep->rowCount()=="0")
{
   return 'Error with remaining disk space';
}
 else
{
  echo $prep->rowCount();
}

这仅返回 1 条记录,尽管下载存储表 $GlobalDB中有两条记录= pdo 连接字符串(有效)

$userid = $_SESSION, 等于 "1"

[下载商店截图] 下载存储表

[购买物品截图]

购买物品表

如您所见,每个表中有 2 条记录,具有有效的 fileid。

但是在使用 IN 子句查询下载存储时,只提取了 1 条记录。

有人可以帮帮我吗?这可能是我忽略的一些愚蠢简单的事情,但我已经三重检查了,我确信我的查询或表格没有任何问题(尽管显然有)。

谢谢,罗伯

4

2 回答 2

2

您需要为数组的每个元素创建一个绑定参数,然后绑定每个元素:

$bindParams = array();
foreach ($ownerIds as $index => $ownerId) {
    $bindParams[] = ':ownerId' . $index;
}

$sql = 'select * from downloadstore where fileid in (' . implode(', ', $bindParams) . ')';
$prep = $db->prepare($sql);

foreach ($ownerIds as $index => $ownerId) {
    $prep->bindValue(':ownerId' . $index, $ownerId);
}
于 2013-04-16T17:42:57.600 回答
0

MySQL中,您不能绑定IN列表。

您应该在客户端解析它并在查询文本中传递它,而不是在绑定变量中:

# sanity checks for $ownerIds go here
$sql="SELECT * FROM downloadstore WHERE fileid IN (" . implode(',', $ownerIds) . ")";

或者,最好在服务器端做所有事情:

SELECT  ds.*
FROM    boughtdownloads bd
JOIN    downloadstore ds
ON      ds.fileId = bd.fileId
WHERE   bd.ownerId = :userId
于 2013-04-16T17:39:34.047 回答