首页 > 解决方案 > 插入用于sql注入的prepare语句后网站上没有数据输出

问题描述

这是之前的代码,它有效

<?php
    include ("connect.php"); // $conn

    $sql = "SELECT name, date, adress, number FROM event ORDER BY date ASC LIMIT 4";    

    foreach ($conn->query($sql) as $row){

        $date = date('j.n.Y');
        $actDate = strtotime($date);
        //echo $date;                               Ausgabe aktuelles Datum im deutschen Format
        //echo $actDate;                            Ausgabe des Datums als Zahl

        $dbDate = $row['date'];
        $eventDate = strtotime($dbDate);
        //echo $dbDate;                             Ausgabe des Datums der Veranstaltung
        //echo $eventDate;                          Veranstaltungsdatum als Zahl

        if ($actDate <= $eventDate) {                                                    
            // hide entrys with lower date 

            $originalDate = $row['date'];                                               
            $formatDate = date('d.m.Y', strtotime($originalDate));                                               
            // hide entrys with lower date 

            echo "  

            <tr>
                <td>".$row['name']."</td>
                <td>$formatDate</td>
                <td class='w3-hide-small'>".$row['adress']."  ".$row['number']."</td>               
            </tr>



            ";
        }
    }
?>

现在我添加了一个针对 SQL 注入的预处理语句,现在新代码没有错误输出,也没有从 DB 输出数据,我不知道在哪里可以找到错误。您可以忽略日期格式,我不会更改任何内容,我认为它只是准备编辑不起作用。

<?php
    include ("connect.php"); // $conn

    $sql = $conn->prepare("SELECT name, date, clock, adress, number, link, info FROM event WHERE (name, date, clock, adress, number, link, info) = (?, ?, ?, ?, ?, ?, ?) ORDER BY date ASC");   
    $sql->bind_param("sississ", $name, $date, $clock, $adress, $number, $link, $info);

    $sql->execute();

    $result = $sql->get_result();
    while ($row = $result->fetch_assoc()) {

        foreach ($conn->query($sql) as $row){

            $date = date('d.m.Y');
            $actDate = strtotime($date);
            //echo $date;                               Ausgabe aktuelles Datum im deutschen Format
            //echo $actDate;                            Ausgabe des Datums als Zahl

            $dbDate     = $row['date'];
            $eventDate  = strtotime($dbDate);
            //echo $dbDate;                             Ausgabe des Datums der Veranstaltung
            //echo $eventDate;                          Veranstaltungsdatum als Zahl

            if ($actDate <= $eventDate) {               // Einträge mit abgelaufenem Datum verbergen 

            $originalDate = $row['date'];                                               
            $formatDate = date('d.m.Y', strtotime($originalDate));

            echo "  

                <div class='accordionEvent nav_bottom w3-container w3-center'><h4>".$row['name']." am $formatDate ab ".$row['clock']."</h4></div>
                <div class='panel head'>
                    <p>Adresse: ".$row['adress']." ".$row['number']."</p>


                    <p>Link: <a href=".$row['link']." target='_blank'>".$row['link']."</a></p> 


                    <p>".$row['info']."</p>
                </div>
                <br>

                ";
            }
        }       
    }   
    $sql->close();  
    $conn->close();
?>

标签: phpmysqldatabaseprepared-statement

解决方案


确保使用相同的语句。如果你没有参数,你可以跳过绑定部分。

<?
$sql = $conn->prepare("SELECT name, date, adress, number FROM event ORDER BY date ASC LIMIT 4");

$sql->execute();

然后删除第 16 行

foreach ($conn->query($sql) as $row){

和第 51 行

}

目前,您正在一遍又一遍地执行查询并覆盖$row 很可能您没有收到错误,因为$sql是准备好的语句而不是字符串。

删除提到的行应该可以解决问题。


推荐阅读