PHP SQL查询不返回结果

时间:2018-09-30 19:04:45

标签: php mysql xampp

我在Web应用程序中有一个按钮,允许用户请求特殊格式的号码。用户单击此按钮时,将运行2个脚本。第一个功能齐全,查看数字表,找到最大的数字并将其递增1。(这不是主键)。第二个正在部分工作的脚本获取当前日期,并运行SQL查询以获取哪个时间段该日期到期。(在这种情况下,期间不一定总是等于一个月),我知道此脚本至少部分起作用,因为我可以访问该脚本文件中调用的$ datetoday变量。但是,它不会从周期表中返回请求的数据。有人可以帮助我确定我在做什么错吗?

<?php
    include 'dbh.inc.php';
    $datetoday = date("Ymd");
    $sql = "SELECT p_num FROM periods where '$datetoday' BETWEEN p_start AND p_end";
    $stmt = mysqli_stmt_init($conn);
    if(!mysqli_stmt_prepare($stmt, $sql)) {
        header("Location: ../quote.php?quotes=failed_to_write");
        exit();
    } else {
        mysqli_stmt_execute($stmt);
        mysqli_stmt_store_result($stmt);
        $result = mysqli_stmt_get_result($stmt);
        $row = mysqli_fetch_assoc($result);
        $pnum = $row;
        mysqli_stmt_close($stmt);
    }

如果有帮助,我将我的代码发布到https://github.com/cwilson-vts/Quote-Appliction

2 个答案:

答案 0 :(得分:0)

因此,首先,我不使用msqli且从未学习过它。但是,我相信我能理解您想做什么。我使用PDO是因为我觉得它更易于使用,更易于阅读,这也是我从一开始就学到的。有点像苹果与三星...没有一种产品是完全错误或正确的。且各有各的优缺点。我将为您提供的是PDO格式,因此希望您能够使用它。而且,如果您不能,那就不用担心。

我想首先解决我看到的一个主要问题,那就是您将变量直接插入mysql语句中。这不是标准做法,并且由于sql注入而不安全。作为参考,我希望您阅读以下网站:

http://php.net/manual/en/security.database.sql-injection.php

http://php.net/manual/en/pdo.prepared-statements.php

接下来,我注意到您使用datetime作为变量名。我建议不要这样做,因为这在大多数编程语言中都是保留的,可能会很棘手。因此,我将其更改为对它不敏感的内容,例如$now = "hello world data";

我也看不到要在哪里打印结果?还是您只是不包括在内? 要考虑的另一件事:日期时间变量与数据库中存储的格式相同吗?因为如果没有,您每次都会返回0个结果。还要确保它也是正确的时区。因为那真的会让您感到困惑。我也会在下面的代码中向您展示。

现在开始实际代码!我将为您提供从数据库连接代码到sql执行的所有内容。

数据库连接文件:

<?php

    $host = '127.0.0.1';
    $user = 'root';
    $pw = '';
    $db = 'test'; // your db name here (replace 'test' with whatever your db name is)

    try {
        // this is the variable will call on later in the main file
        $conn = new PDO("mysql:host=$host;dbname=$db;", $user, $pw);
    } catch (PDOException $e) {
        // kills the page and returns mysql error
        die("Connection failed: " . $e->getMessage());
    }
?>

数据文件:

<?php
    // calls on the db connection file
    require 'dbconfig.php';

    // set default date (can be whatever you need compared to your web server's timezone). For this example we will assume the web server is operating on EST.
    date_default_timezone('US/Eastern');
    $now = date("Ymd");

    // check that the $now var is set
    if(isset($now)) {
        $query = $conn->prepare("SELECT p_num FROM periods WHERE p_start BETWEEN p_start AND :now AND p_end BETWEEN p_end AND :now");
        $query->bindValue(':now', $now);
        if($query->execute()) {
            $data = $query->fetchAll(PDO::FETCH_ASSOC);
            print_r($data); // checking that data is successfully being retrieved (only a troubleshooting method...you would remove this once you confirm it works)
        } else {
            // redirect as needed and print a user message
            die("Something went wrong!");
        }
        $query->closeCursor();
    }
?>

我要提到的另一件事是,请确保遵循适当的步骤进行故障排除。如果它不起作用并且没有出现任何错误,那么我通常通常首先从查询级别开始。我检查以确保查询正确执行。为此,我进入数据库并手动执行。如果这有效,那么我想检查一下我是否确实在收到要声明的变量的值。如您所见,我检查以确保设置了$now变量。如果不是,那段代码甚至都不会运行。 PHP对此可能非常棘手和挑剔,因此请确保您进行检查。如果您不确定也要设置什么变量,只需执行echo $now

即可回显或打印该变量

如果您还有其他问题,请告诉我。希望对您有帮助!

答案 1 :(得分:0)

我想我知道我做错了,肯定比我拥有更多PHP精明知识的人。在上面的代码中,我使用的是mysqli_stmt_store_result,我相信这是在我打算清除变量之前。我对此进行了更改,并对其查询进行了重新整理以使其更加简单。

    <?php
include 'dbh.inc.php';
$datetoday = date("Ymd");
$sql = "SELECT p_num FROM periods WHERE p_start <= $datetoday order by p_num desc limit 1";
$stmt = mysqli_stmt_init($conn);
if(!mysqli_stmt_prepare($stmt, $sql)) {
    header("Location: ../quote.php?quotes=failed_to_write");
    exit();
} else {
    mysqli_stmt_execute($stmt);
    $result = mysqli_stmt_get_result($stmt);
    while( $row = mysqli_fetch_assoc($result)) {
    $pnum = $row['p_num'];
    echo $pnum;
    }
    mysqli_stmt_close($stmt);
}

感谢@rhuntington和@nick尝试提供帮助。抱歉,我真是个白痴。