0

編集: 明確にするために、PDOをMySQLデータベースに使用しています

わかりました、クエリに少し問題があります。グーグルと「スタックオーバーフロー」を試しましたが、役に立ちませんでした。ownerid = '1' であるdownload storeというテーブルからすべてのレコードを選択しようとしています。

//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();
}

downloadstore テーブル に 2 つのレコードがあるにもかかわらず、これは 1 つのレコードのみを返します$GlobalDB= pdo 接続文字列 (これは動作します)

$userid = $_SESSION、これは「1」に等しい

【ダウンロードストア画面】 ダウンロードStoreテーブル

[BoughtItems スクリーンショット]

BoughtItems テーブル

ご覧のとおり、各テーブルには有効なファイル ID を持つ 2 つのレコードがあります。

ただし、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 に答える