为什么只提取数据库中的1个表中的记录

时间:2018-04-29 08:47:42

标签: php html mysql

我是编程新手。在我还是学生的几个小时后,我似乎无法修复它,这是我的论文。

我正在尝试从两个表中获取记录

  1. prisoner
  2. visitations表 - 此表有priser_id外键所以如果我点击囚犯,它也会显示他的访问记录。
  3. 这是我的代码:

    <?php
    
    include "connect.php";
    
    $id = $_GET['id'];
    
    $result = $connect->query(
        "SELECT * FROM prisoner                                                                
           INNER JOIN visitations ON prisoner.prisoner_id = visitations.prisoner_id
           WHERE prisoner.prisoner_id = $id"
    ) or die($connect->error);
    
    $visit = $connect->query(
         "SELECT visitor,date_of_visit,time_of_visit,affinity,homeAddress FROM visitations 
            INNER JOIN prisoner ON prisoner.prisoner_id = visitations.prisoner_id 
            WHERE visitations.prisoner_id = $id"
    ) or die($connect->error);
    

    囚犯表

    while($row = $result->fetch_assoc()){
    
        $id = $row['prisoner_id'];
        $photo = $row['photo'];
        $gname = $row['givenName'];
        $mname = $row['middleName'];
        $lname = $row['lastName'];
        $aname = $row['nickname'];
    
    <div class="row text-center">
                    <?php echo "<img style = 'width: 16%;height: 16%;margin-top:30px;'src='images/".$photo."' >";  
                            echo "<br><br>$gname $mname $lname";
                    ?>
               </div>
    
                <?php
    
                echo "<div class='col-lg-3'>Nickname: $aname </div>";
    }
    

    探访

    <h4>Visitations</h4>
                </div>
    
                <table border = 1>
                <tr>
                    <th>Visitor Name</th>
                    <th>Date of Visit</th>
                    <th>Time of Visit</th>
                    <th>Affinity</th>
                    <th>Home Address</th>
                <tr>
    
                <?php
    
    
                while($row2 = $visit->fetch_assoc()){
    
                    $v_visitor = $row2['visitor'];
                    $v_date = $row2['date_of_visit'];
                    $v_time = $row2['time_of_visit'];
                    $v_affinity = $row2['affinity'];
                    $v_address = $row2['homeAddress'];
    
                echo "
                 <tr>
                    <td>$v_visitor</td>
                    <td>$v_date</td>
                    <td>$v_time</td>
                    <td>$v_affinity</td>
                    <td>$v_address</td>
                 </tr>
    
                 </table>";
    
                 }
    

    它只从访问表中获取记录                  我也不知道为什么其他记录不在HTML表格内。

    这就是它显示的内容:

    visitationtble

    有人可以用我的代码指出问题,

2 个答案:

答案 0 :(得分:2)

在此上下文中,每个连接只能使用一个活动语句,因此在继续使用新查询之前,您需要使用fetch_all使用第一个查询的整个结果集。

$result1 = $connect->query(...)
$rows1 = $result1->fetch_all(MYSQLI_ASSOC);

$result2 = $connect->query(...)
$rows2 = $result2->fetch_all(MYSQLI_ASSOC);

foreach ($rows1 as $row) ...

foreach ($rows2 as $row) ...

也可以使用multi_query在一个批处理中执行多个查询。

答案 1 :(得分:1)

接下来提到的SQL注入问题(归结为:我如何正确编码SQL查询)还有更多可能出错的问题,另一个是HTML注入问题(归结为:我如何正确编码HTML)。

简而言之:HTML表格只能关闭一次,并且始终是第一个匹配的结束</table>标记。与在OPs代码中一样,每行输出一个关闭表标记(在while主体内),在关闭表的第一行之后,按照HTML规则呈现进一步的数据,如何呈现文本 - 超出范围的标签内的数据(即此处表格下方的文字)。

因此,不仅关于SQL注入的SQL作业,而且首先要对如何改进编写PHP模板文件感到满意。例如,您可以从<?= $variable ?>表示法中受益,因为这是HTML而不是纯文本,因此<?= htmlspecialchars($variable) ?>变体更为正确。