2009-06-11 63 views
0

用户从不同的页面访问此页面,点击一个链接,然后附加?photo_id=,然后添加ID号。我希望查看者在到达此页面时可以获得某些信息。为MySQLI使用已初始化的预处理语句时,leftjoin如何工作?

我希望他们能够看到照片,照片名称和摄影师的名字。前两个不是问题,因为photo_id,photo_filenamephoto_title都在同一个表中。只要我尝试获取有关此照片的信息,该信息位于名为photographers的不同表格中,那就是当我遇到问题时。

这里是我的代码:

$sql = 'SELECT photos.photo_id, photos.photo_title, photos.photo_filename, photos.photographer_id, photographers.photographer_id, photographers.photographer_name 
     FROM photos 
     LEFT JOIN photographers ON photos.photographer_id = photographers.photographer_id 
     WHERE photo_id = ?'; 

//initialize prepared statement 
$stmt = $conn->stmt_init(); 
if ($stmt->prepare($sql)) { 
    $stmt->bind_param('i', $_GET['photo_id']); 
    $stmt->bind_result($photo_id, $photo_title, $photo_filename, $photographer_id); 
    $OK = $stmt->execute(); 
    $stmt->fetch(); 
} 

前三个变量($photo_id$photo_title$photo_filename)做工精细,我可以附和出来我的网页上,但我从LEFTJOIN这样添加的其他变量因为来自不同表格的photographers.photographer_idphotographers.photographer_name将不起作用。据了解,当我在SELECT行上添加额外的列名时,页面完全中断。

我有一种感觉,它与bind_result()函数中的变量数量有关。我认为他们需要匹配SELECT行中提到的列数,但我并不想为每个列创建一个变量。

有人可以帮我吗?

回答

0

就像您提到的那样,您选择了六列,但只绑定了前四列。如果您不需要全部六列,请不要选择它们。没有必要选择你加入的列,如果这就是你的想法。

0

@BipedalShark说什么,加...: 因为你正在做一个LEFT JOIN,就一定意味着你准备的照片,其拍摄者未知或从拍摄表(*)缺少 - 但在这如果您从该表中删除的列是NULL。也许你想COALESCE他们在你的SQL?或者,也许你的意思是INNER JOIN ......?只是检查!

(*),这就是LEFT JOIN意味着 - 这是一个加盟,保证你从左边的表中的所有行匹配WHERE,即使在没有匹配的行右表