【问题标题】:PHP MySQL query from date variable来自日期变量的 PHP MySQL 查询
【发布时间】:2017-10-16 11:34:28
【问题描述】:

我正在尝试根据用户输入的日期从我的数据库中查询一个表。 这是我的代码:

<input type="date" name="date" value="<?php echo date('Y-m-d'); ?>">
<input type="submit" value=">" onclick="showDate(this.value)">

用于用户输入(默认为当前日期)

这是我的 php 脚本

$q = $_GET['date'];

$sql="SELECT * FROM mathtest WHERE testdate = '$q'";
$result = mysqli_query($con,$sql);

这是我的 ajax 脚本:

<script>
function showDate(str) {
if (str == "") {
document.getElementById("mathtestHere").innerHTML = "";
return;
} else {
if (window.XMLHttpRequest) {
    // code for IE7+, Firefox, Chrome, Opera, Safari
    xmlhttp = new XMLHttpRequest();
} else {
    // code for IE6, IE5
    xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
}
xmlhttp.onreadystatechange = function() {
    if (this.readyState == 4 && this.status == 200) {
        document.getElementById("mathtestHere").innerHTML = 
this.responseText;
    }
};
xmlhttp.open("GET","getmathdate.php?q="+str,true);
xmlhttp.send();
}
}
</script>

还有我的php echo函数:

echo "<table>
<tr>
<th>ID</th>
<th>First name</th>
<th>Last name</th>
<th>Level</th>
<th>Time</th>
<th>Score</th>
<th>Date</th>
<th>Added by</th>
</tr>";
while($row = mysqli_fetch_array($result)) {
echo "<tr>";
echo "<td>" . $row['id'] . "</td>";
echo "<td>" . $row['firstname'] . "</td>";
echo "<td>" . $row['lastname'] . "</td>";
echo "<td>" . $row['testlevel'] . "</td>";
echo "<td>" . $row['testtime'] . "</td>";
echo "<td>" . $row['testscore'] . "</td>";
echo "<td>" . $row['testdate'] . "</td>";
echo "<td>" . $row['addedBy'] . "</td>";
echo "</tr>";
}
echo "</table>";
mysqli_close($con);

然后回显到一个 php 表中。我正在使用 AJAX onclick 函数将表格呈现到我的正文中。

由于某种原因,它不会显示在该日期进行的测试。 谢谢!

【问题讨论】:

  • testdate 列的datatype 是什么?
  • 您对SQL Injections 持开放态度,应该真正使用Prepared Statements 而不是连接您的查询。特别是因为您根本没有逃避用户输入!
  • 我知道这与问题无关,但请记住转义您的参数
  • 你如何回应结果?您还刚刚添加了调用一些 JS 的提交按钮。这里有很多未知数。您需要向我们展示所有相关代码(来自输入字段 => 提交按钮 => js 函数 => 查询 => 结果的回显)。
  • 您不应剥离或转义数据。您应该使用准备好的语句,这样更安全。我还建议您从一开始就这样做,而不是尝试在您将要更改的代码中修复此类错误。

标签: php mysql


【解决方案1】:

首先是按钮上的onclick 属性,其值为&gt;

<input type="submit" value=">" onclick="showDate(this.value)">

这里会发生的是它将传递按钮的值而不是日期字段的值。只需删除按钮的value 属性和showDate 函数的this.value 参数即可:

<input type="submit" onclick="showDate()">

并为您的日期字段分配一个id 属性:

<input type="date" name="date" id="date" value="<?php echo date('Y-m-d'); ?>">

然后在你的脚本上,我们要获取日期的值:

function showDate() {

    var str = document.getElementById("date").value; /* GET THE VALUE OF DATE FIELD */

    if (str == "") {
        document.getElementById("mathtestHere").innerHTML = "";
        return;
    } else {

    /** CONTINUATION OF YOUR SCRIPT HERE **/

div在哪里?

只需确保您有一个 div 元素,该元素的 id 属性为 mathtestHere

<div id="mathtestHere"></div> <!-- RESULT WILL BE PUT HERE -->

永远不要将原始变量绑定到您的查询!

让我们转到您的getmathdate.php 文件。让我们改用prepared statement 来保护要在脚本中绑定的变量:

/** INCLUDE HERE YOUR DATABASE CONNECTION **/

$q = !empty($_GET['q'])?$_GET['q']:'';

$a = '<table>
        <tr>
            <th>ID</th>
            <th>First name</th>
            <th>Last name</th>
            <th>Level</th>
            <th>Time</th>
            <th>Score</th>
            <th>Date</th>
            <th>Added by</th>
        </tr>';

$stmt = $con->prepare("SELECT id, firstname, lastname, testlevel, testtime, testscore, testdate, addedBy FROM mathtest WHERE testdate = ?");
$stmt->bind_param("s", $q);
$stmt->execute();
$stmt->store_result();
$stmt->bind_result($id, $firstname, $lastname, $testlevel, $testtime, $testscore, $testdate, $addedby);
while($stmt->fetch()){
    $a .= '<tr>
               <td>'.$id.'</td>
               <td>'.$firstname.'</td>
               <td>'.$lastname.'</td>
               <td>'.$testlevel.'</td>
               <td>'.$testtime.'</td>
               <td>'.$testscore.'</td>
               <td>'.$testdate.'</td>
               <td>'.$addedby.'</td>
           </tr>';
}
$stmt->close();

$a .= '</table>';

echo (!empty($q))?$a:'No results found.';

还要检查控制台日志中的错误。您通常可以通过在浏览器上按 F12 来找到它。

【讨论】:

  • 非常感谢您的帮助。我仍在学习这个过程,所以这对我来说意义重大,我一定会在我未来的所有项目中坚持准备好的陈述
【解决方案2】:

你的一个相当严重的错误是

<input type="submit" value=">" onclick="showDate(this.value)">

由于输入是this,而在这种情况下.value&gt;,而不是日期。

为了解决这个问题,我将您的 HTML 代码更改为:

<input type="date" name="date" id="date-selector" value="<?php echo date('Y-m-d'); ?>">
<input type="submit" value=">" onclick="showDate()">

和javascript:

function showDate() {
    var str = document.getElementById("date-selector").value;
    if (str == "") {
        document.getElementById("mathtestHere").innerHTML = "";
        return;
    } else {
        if (window.XMLHttpRequest) {
            // code for IE7+, Firefox, Chrome, Opera, Safari
            xmlhttp = new XMLHttpRequest();
        } else {
            // code for IE6, IE5
            xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
        }
        xmlhttp.onreadystatechange = function() {
            if (this.readyState == 4 && this.status == 200) {
                document.getElementById("mathtestHere").innerHTML =
                    this.responseText;
            }
        };
        xmlhttp.open("GET","getmathdate.php?q="+str,true);
        xmlhttp.send();
    }
}

【讨论】:

  • 非常感谢!非常感谢
【解决方案3】:

如果您的数据库中testdate 列的数据类型是date,则日期格式存在问题。你应该像这样尝试你的php。

$q = $_GET['date'];
$sql="SELECT * FROM mathtest WHERE testdate = STR_TO_DATE('$q','%Y-%m-%d')";
$result = mysqli_query($con,$sql);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-02-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-16
    相关资源
    最近更新 更多