2014-09-13 34 views
0

我正在構建一個簡單的留言板,需要從3個不同的表中獲取信息以顯示主要摘要頁面。我正在使用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)):?>' - 同時確保啓用短標籤'<?=' - 如果沒有,請執行<<?php echo' – 2014-09-13 03:22:19

+0

哦,對不起,這是一個錯字。 – Cbas 2014-09-13 13:31:51

回答

0

也許這是不可能的..我想通過另一種方式來實現它。

我可以用MAX查詢獲得最新的討論ID,然後使用標準for循環來獲取我需要的所有信息。通過這個實現,我甚至可以從討論表中刪除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); 
}