PHP SQL 查询没有 return 结果
PHP SQL query doesnt return a result
我在 Web 应用程序中有一个按钮,允许用户请求特殊格式的号码。当用户单击此按钮时 2 个脚本 运行。第一个功能齐全,查看数字 table 找到最大的数字并将其递增 1。(这不是主键)第二个部分工作的脚本获取当前日期和 运行s SQL 查询以获取日期所在的时间段。(在这种情况下,时间段并不总是等于整月)我知道该脚本至少部分有效,因为我可以访问该脚本中调用的 $datetoday 变量文件。但是,它不会从期间 table 返回请求的数据。谁能帮我找出我做错了什么?
<?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
所以首先,我不使用 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";
我也没有看到你在哪里打印结果?或者你只是没有包括那个?
另一件需要考虑的事情:您的日期时间变量的格式是否与您存储在数据库中的格式相同?因为如果没有,你每次都会 return 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
即可回显或打印它
如果您还有其他问题,请告诉我。希望对您有所帮助!
我想我知道我做错了什么,比我聪明 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 的帮助。对不起,我是个白痴。
我在 Web 应用程序中有一个按钮,允许用户请求特殊格式的号码。当用户单击此按钮时 2 个脚本 运行。第一个功能齐全,查看数字 table 找到最大的数字并将其递增 1。(这不是主键)第二个部分工作的脚本获取当前日期和 运行s SQL 查询以获取日期所在的时间段。(在这种情况下,时间段并不总是等于整月)我知道该脚本至少部分有效,因为我可以访问该脚本中调用的 $datetoday 变量文件。但是,它不会从期间 table 返回请求的数据。谁能帮我找出我做错了什么?
<?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
所以首先,我不使用 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";
我也没有看到你在哪里打印结果?或者你只是没有包括那个? 另一件需要考虑的事情:您的日期时间变量的格式是否与您存储在数据库中的格式相同?因为如果没有,你每次都会 return 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
如果您还有其他问题,请告诉我。希望对您有所帮助!
我想我知道我做错了什么,比我聪明 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 的帮助。对不起,我是个白痴。