2013-03-01 4 views
5

Если я заменил первый% s всего на 244, я получу сумму без проблем. Но при использовании динамического значения в этом случае $ shot он, похоже, ничего не получает, и ни мой запрос не выполняется, как другие результаты в порядке (например, story.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

Так вы избегаете строки дважды? – 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'" 

Это не имеет ничего общего с вопросом, но много общего с оптимизацией.

0

Учитывая, что идентификатор всегда числовой,

Сделать $shot = (int)$_GET['shot']; (% D спецификатор рассматривает переменную как целое число, но, возможно, это нужно где-то еще).

Затем замените:

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

и

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

Нет необходимости делать mysql_real_escape_string (why?).

+0

Я думаю, что нет необходимости санировать вход дважды, сначала с typecasting '(int)', а затем '% d'. вы можете использовать один из вышеперечисленных, и этого будет достаточно. – diEcho

+0

Если '$ shot' нужен где-нибудь еще в коде, это хорошо, чтобы отличить его от правильного типа. – Alasjo

+0

Да, использование '% d' очень безопасно ... не нужно вводить текст перед формированием запроса с помощью' (int) ' – diEcho

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 . "'"; 
Смежные вопросы