php sql查询不返回结果

ef1yzkbh  于 2021-06-19  发布在  Mysql
关注(0)|答案(2)|浏览(301)

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

<?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

7y4bm7vi

7y4bm7vi1#

所以首先,我不使用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"; 我也不知道你会在哪里打印结果?或者你只是没有包括这些?另一个需要考虑的问题是:datetime变量的格式是否与数据库中存储的格式相同?因为如果不是,每次都会返回0个结果。也要确保它是正确的时区。因为那会让你很难过。我也会在下面的代码中告诉你。
现在开始实际代码!我将为您提供从db连接代码到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 如果你还有其他问题,请告诉我。我希望这对你有帮助!

ujv3wf0j

ujv3wf0j2#

我想我知道我做错了什么,比我聪明的人肯定会说。在我上面使用的代码中 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的帮助。对不起,我真是个白痴。

相关问题