2014-09-13 4 views
0

Я создаю простую доску объявлений и вам нужно получить информацию из трех разных таблиц, чтобы отобразить основную сводную страницу. Я использую протокол mysqli_stmt и не могу понять, как получить первое сообщение и имя автора для каждого обсуждения, поскольку все запросы sql необходимо закрыть до того, как будет подготовлен другой.mysqli_stmt получить ограниченные данные из 3 таблиц

Вот упрощенная версия кода я бегу, чтобы создать свою базу данных:

CREATE TABLE `users` (
`id` INT(25) UNSIGNED AUTO_INCREMENT PRIMARY KEY , 
`name` VARCHAR(65) NOT NULL 
); 
CREATE TABLE `discussions` (
`id` INT(25) UNSIGNED AUTO_INCREMENT PRIMARY KEY , 
`subject` VARCHAR(120) NOT NULL , 
`last_author` INT(25) NOT NULL 
); 
CREATE TABLE `messages` (
`id` INT(25) UNSIGNED AUTO_INCREMENT PRIMARY KEY , 
`discussion` INT(25) NOT NULL , 
`author` INT(25) NOT NULL , 
`message` TEXT 
); 

Можно ли сформировать запрос, который будет выбирать все обсуждения, а для каждой дискуссии, выберите тему, последний автора имя и самый последний текст сообщения?

я могу использовать этот код, чтобы отобразить все предметы каждой дискуссии:

<?php 
$sqlcmd = "SELECT * FROM _discussions"; 
$get = mysqli_prepare($sqlConnection,$sqlcmd); 
mysqli_stmt_execute($get); 
mysqli_stmt_bind_result($get, $id, $subject, $last_author); 

while(mysqli_stmt_fetch($get)) : ?> 

    <li><?=$subject?></li> 

<?php endwhile; 
mysqli_stmt_close($get); 
?> 

, но как я могу получить имя автора и сообщение, если я не могу инициировать другую SQL запроса внутри цикла?

+0

Это 'в то время как (mysqli_stmt_fetch ($ получить)); ?> 'должно быть' while (mysqli_stmt_fetch ($ get)):?> '- Также убедитесь, что короткие теги активированы'

+0

О, извините, что это было опечатка. – Cbas

ответ

0

Возможно, это невозможно .. Я понял другой способ его реализации.

Я могу получить последний идентификатор обсуждения с MAX-запросом, а затем использовать стандартный цикл для получения всей необходимой информации на основе этого идентификатора. С этой реализацией я даже могу удалить поле last_author из таблицы обсуждений.

Этот код не упрощен и включает проверки ошибок. Я уверен, что он может быть реорганизован немного.

<?php 

//get LAST discussion 
$sqlcmd = "SELECT MAX(_id) FROM _discussions"; 
$get = mysqli_prepare($app->sql,$sqlcmd); 
if(!$get) $app->log_sqlError(); 
if(!mysqli_stmt_execute($get)) $app->log_sqlError(); 
if(!mysqli_stmt_bind_result($get,$last_id)) $app->log_sqlError(); 
if(mysqli_stmt_fetch($get)==FALSE) $app->log_sqlError(); 
if(!mysqli_stmt_close($get)) $app->log_sqlError(); 

$app->log('last discussion id: '.$last_id); 
?> 
<ul> 
<?php for($i=$last_id;$i>0;$i--) : 

    //get DISCUSSION 
    $sqlcmd = "SELECT * FROM _discussions WHERE _id=".$i; 
    $get = mysqli_prepare($app->sql,$sqlcmd); 
    if(!$get) $app->log_sqlError(); 
    if(!mysqli_stmt_execute($get)) $app->log_sqlError(); 
    if(!mysqli_stmt_bind_result($get,$id,$subject,$original_author,$created,$updated)) 
     $app->log_sqlError(); 

    //IMPORTANT - move on if the discussion was not found 
    if(mysqli_stmt_fetch($get)==FALSE) $id=0; 
    if(!mysqli_stmt_close($get)) $app->log_sqlError(); 
    if($id!=0) : 

    //get last MESSAGE id 
    $get = mysqli_prepare($app->sql,"SELECT MAX(_id) FROM _messages WHERE _discussion=".$i); 
    if(!$get) $app->log_sqlError(); 
    if(!mysqli_stmt_execute($get)) $app->log_sqlError(); 
    if(!mysqli_stmt_bind_result($get,$message_id)) 
     $app->log_sqlError(); 
    if(mysqli_stmt_fetch($get)==FALSE) $app->log_sqlError(); 
    if(!mysqli_stmt_close($get)) $app->log_sqlError(); 

    //get last MESSAGE 
    $get = mysqli_prepare($app->sql,"SELECT * FROM _messages WHERE _id=".$message_id); 
    if(!$get) $app->log_sqlError(); 
    if(!mysqli_stmt_execute($get)) $app->log_sqlError(); 
    if(!mysqli_stmt_bind_result($get,$m_id,$discussion_id,$author,$text,$created_time)) 
     $app->log_sqlError(); 
    if(mysqli_stmt_fetch($get)==FALSE) $app->log_sqlError(); 
    if(!mysqli_stmt_close($get)) $app->log_sqlError(); 

    //get AUTHOR 
    $get = mysqli_prepare($app->sql,"SELECT _name FROM _users WHERE _id=".$author); 
    if(!$get) $app->log_sqlError(); 
    if(!mysqli_stmt_execute($get)) $app->log_sqlError(); 
    if(!mysqli_stmt_bind_result($get,$name)) 
     $app->log_sqlError(); 
    if(mysqli_stmt_fetch($get)==FALSE) $app->log_sqlError(); 
    if(!mysqli_stmt_close($get)) $app->log_sqlError(); 
    ?> 

    <li><p><?=$subject?> | <?=$name?> | <?=$text?> | <?=$created_time?></p></li> 

<?php endif; endfor; ?> 
</ul> 

Это log_sqlError функция выглядит примерно так:

function log_sqlError(){ 
    print_r('errno: '.$this->sql->errno.', error: '.$this->sql->error); 
} 
Смежные вопросы