2013-06-07 4 views
0

Я делаю форум для своей игры. В настоящее время я работаю над функцией редактирования. Что я пытаюсь выяснить, как я могу проверить, что зарегистрированный аккаунт принадлежит игроку, который отправил сообщение. Вы публикуете свой плеер, а не учетную запись. У вас может быть несколько игроков. Пользователь может иметь несколько «игроков», назначенных им. Если они не владеют игроком, который отправил сообщение, я хочу вернуть false, но если они это сделают, это правда.PDO запрос не возвращает ожидаемый результат

# table accounts 
id | username | password 

# table posts 
id | posterid (this is the player id) | message 

# table players 
id | account_id | name 

Вот как далеко я пришел. Но это возвращает false независимо от того, что. Существует сообщение с ID 666, а игрок, который разместил его, принадлежит учетной записи 34767. Таким образом, он должен работать.

function can_we_edit_post($pid) { 

global $db; 

// Let's see if they have permission to edit 
$stmt = $db->prepare("SELECT * FROM players pl a JOIN posts p ON p.id = $pid WHERE pl.account_id = 34767"); 
$stmt->execute(array(34767)); 
$row = $stmt->fetch(); 

// Check if we got any rows 
if ($row) { 
    return true; 
} else { 
    return false; 
} 

} 

if (can_we_edit_post(666)) { 
    echo "You may edit this post."; 
} else { 
    echo "You do not own this post."; 
} 
+1

Не должно быть вашего запроса 'pl.account_id =?'? – halfer

+0

да, мой плохой! но все равно не работает, он всегда возвращает false hmm – Kaka

ответ

1

Вы странствующий a после pl, поэтому ваш запрос, вероятно, не суметь

SELECT * FROM players pl a JOIN posts p ON p.id = $pid WHERE pl.account_id = 34767 
         ^

попробовать что-то вроде этого (с использованием заполнителей для предотвращения инъекций SQL) -

// Let's see if they have permission to edit 
$stmt = $db->prepare("SELECT * FROM players pl JOIN posts p ON p.id = ? WHERE pl.account_id = ?"); 
$stmt->execute(array($pid, 34767)); 
$row = $stmt->rowCount(); 

смотреть на это sqlfiddle - http://sqlfiddle.com/#!2/e282a1/2 - без a запрос возвращает результат, при ошибке a запрос завершается с ошибкой.

EDIT
Это, вероятно, возвращение true для каждого игрока, потому что вы зашиты в pl.account_id -

WHERE pl.account_id = 34767 

и вы не проверяя, если posterid соответствует pl.id для конкретного post.id, которые вы можете сделать путем добавления - AND p.posterid = pl.id к вашему JOIN

function can_we_edit_post($pid,$aid) { 

global $db; 

// Let's see if they have permission to edit 
$stmt = $db->prepare("SELECT * FROM players pl JOIN posts p ON p.id = ? AND p.posterid = pl.id WHERE pl.account_id = ?"); 
$stmt->execute(array($pid, $aid)); 

// Check if we got any rows 
if ($stmt->rowCount()) { 
    return true; 
} else { 
    return false; 
} 

} 


if (can_we_edit_post(666,34767)) { // change 34767 to each player account_id ie. $player->account_id 
    echo "You may edit this post."; 
} else { 
    echo "You do not own this post."; 
} 
+0

спасибо, как я мог это пропустить. теперь мне нужно только выяснить, почему он возвращает true, даже если учетная запись не принадлежит этому игроку. – Kaka

+0

Вероятно, он возвращает 'true', потому что вы жестко закодированы в' pl.account_id'. Я добавлю изменения с возможностью исправления. – Sean

+0

хорошо, независимо от того, какой плакат существует до тех пор, пока учетная запись существует, кто-нибудь может отредактировать сообщение hmm – Kaka

1

Вы используете PDO неправильно. Вы должны сделать это так:

$stmt = $db->prepare("SELECT * FROM players pl a JOIN posts p ON p.id = :pid WHERE pl.account_id = :id"); 
$stmt->execute(array(':pid' => $pid, ':id' => 34767)); 
return (($stmt->rowCount() > 0)? true : false); 

PDO и выполнить гениально, потому что вы просто поставить ключи, которые вы хотите заменить со значениями, и он будет бежать, и сделать его безвредным для вас.

Если остальная часть запроса верна, этот код должен работать. rowCount возвращает количество строк, возвращаемых запросом. Если вы просто хотите узнать, вернет ли он что-нибудь, вы можете использовать это вместо использования fetch.

+1

Вы оставили его открытым для SQL-инъекции еще;) –

+0

спасибо! Я только недавно начал использовать pdo вместо mysql и mysqli в течение многих лет – Kaka

+0

, однако он не решил мою главную проблему. – Kaka

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