2013-09-28 6 views
0

Afternoon,Неверное значение из PHP/MySQL запрос

У меня есть функция здесь, где я пытаюсь вернуть простое значение 0, если нет записи, где пользователь имеет роль администратора или 1, если они делают , Командная строка SQL работает абсолютно нормально, однако при ее запуске через страницу она всегда возвращает значение 4, что является числом записей в таблице.

Полностью смущен, глядя на него так долго, любые идеи? Как я уже сказал, запрос при запуске непосредственно в mysql возвращает правильное значение, поэтому я не уверен, почему он возвращает 4 каждый раз.

Заранее спасибо.

function userHasRole($role) 
    { 
include '../includes/db-connect.inc.php'; 
echo $_SESSION['username']; 
try 
{ 
    $sql = "SELECT count(*) FROM users 
     INNER JOIN userrole ON users.id = userid 
     INNER JOIN role ON roleid = role.id; 
     WHERE username = :username AND role.id = :roleId"; 

    $s = $PDO->prepare($sql); 
    $s->bindValue(':username', $_SESSION['username']); 
    $s->bindValue(':roleId', $role); 
    $s->execute(); 
} 
catch (PDOException $e) 
{ 
    $error = 'Error searching for author roles.'; 
    echo $error; 
    exit(); 
} 


$row = $s->fetch(); 
if ($row[0] > 0) 
{ 
    return TRUE; 
} 
else 
{ 
    return FALSE; 
} 

} 
+0

У вас есть ошибки? Вы называете функцию? Я не вижу никакого вызова функции. – bish

+0

К сожалению, должен был добавить, что я использую if (! UserHasRole ('Administrator')) ... на другой странице, и все работает отлично, я имею в виду, если я изменил if ($ row [0] == 1), тогда он блокирует меня, поскольку он, конечно, продолжает возвращаться 4, так что все работает, как и должно быть, кроме того, чтобы управлять списком неправильного количества пользователей, у которых есть администратор. – Holo

+1

Предложение для отладки: отобразите все строки $ row перед проверкой значения $ row [0]. Предложение для написания SQL: просто скажите «выберите 1 из пользователей ...» вместо count (*). Вы действительно не нуждаетесь в фактическом подсчете, и делать это таким образом должно быть все равно быстрее. Как только вы увидите, что находится в строке $ row, если что-нибудь, это должно сказать вам о проблеме. – MJB

ответ

0

У вас есть точка с запятой, где вы не хотите ее - после второго внутреннего соединения. Избавьтесь от этого и повторите попытку. Я думаю, что предложение WHERE полностью игнорируется.

$sql = "SELECT count(*) FROM users 
     INNER JOIN userrole ON users.id = userid 
     INNER JOIN role ON roleid = role.id; 
     WHERE username = :username AND role.id = :roleId"; 

Извините, я должен был сразу это заметить. Вероятно, это не вызывает ошибки, потому что PHP даже не позволяет запускать несколько SQL-инструкций в упрощенной попытке предотвратить SQL-инъекцию. Итак, все после точки с запятой игнорируется.

+0

MJB, просто lol. Как только я прочитал вашу первую строчку, я подумал о том, о чем он говорит ... Тогда я посмотрел на role.id и просто повесил голову стыд .. Спасибо большое за то, что он заметил, следовательно, он возвращал 4, поскольку он подсчитал 4 и не определил ни одного! AGGHHHHH!!: P – Holo

+0

Бывает у лучших из нас. Я тоже был очень смущен, прокомментировал 3 раза без замечая это. – MJB

+0

Он работал нормально, когда я пытался его непосредственно в mysql, который был nnoying me, но, конечно, когда я вводил его в командную строку, я не делал ошибки добавления; вздох! :) – Holo

Смежные вопросы