2016-12-15 7 views
0

まず最初にStackoverflowとPHPには新しいので、私には難しくありません。 SQLクエリで今週苦しんでPHPのSQL文が(PDO)準備文に変換されました

イム:私は、ハイスコアとランキングいわゆる「ハイスコア」と列と呼ばれるテーブルを持っているので、

SET @i=0;UPDATE highscores SET [email protected]:=(@i+1) ORDER BY highscore DESC; 

私はこのSQLクエリを使用します。このコードは、ランキングシステムを自動的に整理するのに役立ちます(最高のハイスコアはランク1など(同じ高得点の同じランクはありません))が、PHPを使用しているので、PDOの準備文それをやる方法が本当に混乱しています。私はいくつかの例では、コードスニッファがデータベースに入ることはありませんので、セキュリティで保護されたpdoの準備されたステートメントにこのSQLクエリを変換する必要があります。これは動作するコードです:

$stmt = $db->prepare("SET @i=0;UPDATE highscores SET [email protected]:=(@i+1) ORDER BY highscore DESC;  
$stmt->execute(); 

しかし、あなたはそれが保証されていません。私は配列とbindparamsを試しましたが、私は本当にそれを確保しながら実際にそれを稼働させる方法を混乱させました。私はあなたが私が3日のようにこれで苦労している私を助けることができることを願っています。

答えて

0

クエリの外部から変数を使用していないので、このクエリは安全です。あなたが素敵なSELECT COUNTクエリで簡単にランキングを受け取れるので、私が変更する唯一のことはこの構造を削除することです。

$query = $pdo->prepare('SELECT COUNT(id) AS count FROM highscores WHERE highscore < :highscore'); 
$query->execute(['highscore' => $highscore]); 
$row = $query->fetch(PDO::FETCH_ASSOC); 

$ranking = (intval($row['count']) + 1); 

これは単純な例です、あなたはあなたが独自のランキングを得るでしょうそのように、この項目の前に何が来るのか確認した後のIDでそれを注文することができます。