2013-03-01 38 views
5

如果我用244替換第一個%s,我可以得到沒有任何問題的總和。但是,在這種情況下使用動態值$ 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 2013-03-01 07:03:31

+0

那麼你是否逃避了兩次字符串? – Passerby 2013-03-01 07:03:35

+0

什麼是$射擊?當你var_dump時它說了什麼? – 2013-03-01 07:06:17

回答

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'" 

這無關你的問題,但有很多事情要做與優化。

0

鑑於ID始終是數字,

$shot = (int)$_GET['shot'];(%d個符把變量爲整數,但您可能需要在別的地方)。

然後更換:

reviews.storyid='%s'reviews.storyid=%d

WHERE stories.id = '%s'WHERE stories.id = %d

不需要做mysql_real_escape_stringwhy?)。

+0

我認爲沒有必要對輸入進行兩次清理,首先使用類型爲'(int)'和'%d'的類型。你可以使用上面的一個,這就足夠了。 – diEcho 2013-03-01 07:14:25

+0

如果在代碼的其他地方需要'$ shot',我認爲把它轉換成正確的類型是很好的。 – Alasjo 2013-03-01 07:16:03

+0

是的,使用'%d'是非常安全的......無需在使用'(int)形成查詢之前鍵入強制轉換' – diEcho 2013-03-01 07:20:39

0

之前執行查詢,打印使用

echo $query; 

,看看是什麼結果,如果當你把手動值比你需要改變它它不是喜歡。

我建議使用。

$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 . "'";