2013-03-01 5 views
5

最初の%sをちょうど244に置き換えると、問題なく合計が得られます。しかし、この場合の$ shotの動的値を使用すると、何も取得されないように見え、他の結果が正常な場合(例:stories.id、stories.title)にクエリが失敗することもありません。空のSUM()と動的値

$query = sprintf(" 
SELECT 
stories.id, 
stories.title, 
stories.timestamp, 
stories.text, 
users.name, 
users.avatar, 
users.id AS idus, 
(SELECT sum(reviews.amount) FROM reviews WHERE reviews.storyid='%s') AS reviews 

FROM stories INNER JOIN users ON stories.uid=users.id WHERE stories.id = '%s'", 
    mysql_real_escape_string($shot), 
    mysql_real_escape_string($shot)); 

ショットはここから来ている:私はこのような何かを書くと

$shot = $_GET['shot'];  
+1

+1のエスケープ用^^ – span

+0

文字列を2回エスケープしていますか? – Passerby

+0

'$ shot'とは何ですか?あなたがそれを 'var_dump'すると何と言いますか? –

答えて

1

SELECT 
stories.id, 
stories.title, 
stories.timestamp, 
stories.text, 
users.name, 
users.avatar, 
users.id AS idus, 
SUM(reviews.amount) as reviews 
FROM stories 
INNER JOIN users ON stories.uid=users.id 
INNER JOIN reviews ON stories.id = reviews.storyid 
WHERE stories.id = '%s'" 

これは、あなたの質問が、最適化してやるべきことがたくさんとは何の関係もありません。 idは常に数値であることを考えると

0

は、

は(%dの指定子は整数として変数を扱いますが、あなたはどこかにそれが必要になる場合があります)$shot = (int)$_GET['shot'];してください。

は、次に置き換える:

reviews.storyid='%s'mysql_real_escape_stringwhy?)を行うWHERE stories.id = %d

不要と

WHERE stories.id = '%s'reviews.storyid=%dで。

echo $query; 

を使用して、それを印刷し、クエリを実行する前に

+0

入力を2回消す必要はないと思いますが、最初に '(int)'と次に '%d'をタイプキャスティングします。上記のいずれかを使用すれば十分です。 – diEcho

+0

'$ shot'がコード内の他の場所で必要とされるなら、それを正しい型にキャストするのは良いことだと思います。 – Alasjo

+0

はい、 '%d'を使うと安全です...'(int) 'を使ってクエリを作成する前にキャストを入力する必要はありません – diEcho

0

、あなたがそれを変更する必要があるよりも、手動で値を入れたときに、それが好きイマイチ場合は、結果が何であるかを参照してください。

私は使用することをお勧めします。

$shot = mysql_real_escape_string($shot); 
$query = "SELECT 
stories.id, 
stories.title, 
stories.timestamp, 
stories.text, 
users.name, 
users.avatar, 
users.id AS idus, 
(SELECT sum(reviews.amount) FROM reviews WHERE reviews.storyid='" . $shot . "') AS reviews 

FROM stories INNER JOIN users ON stories.uid=users.id WHERE stories.id = '" . $shot . "'";