簡體   English   中英

這個MySQL查詢有效嗎?

[英]Is this MySQL query valid?

因此,當我拜訪朋友時遇到了這個問題。 他正試圖在表中顯示其創建的數據庫中的數據。

這是他要求開始和結束日期的部分:

<form method="post">
    <input type="date" name="Date1" value="<?php echo $_POST['StartD'] ?>" style="position:absolute; top:2em; left:7em;">
    <p style="font-family:Calibri; color:green; font-size:15px; position: absolute; top: 1em; left: 18em;">to</p>
    <input type="date" name="Date2" value="<?php echo $_POST['EndD'] ?>" style="position:absolute; top:2em; left:23em;"><br />
    <input type="submit" id="Sbtn" style="cursor: pointer;" name="search_projects" value="Search">
</form>

現在這是他的MySQL查詢:

$sql= "SELECT * FROM statisticData WHERE accessDate LIKE '%" . $_POST['StartD'] . "%' OR accessDate LIKE '%" . $_POST['EndD'] . "%' ORDER BY accessDate ASC";

每當他選擇的明星日期: 09-13-13和結束日期: 09-13-13 ,日期,如09-12-13也出現在表格中。 我告訴他去問專業人士,他說他太害羞了。 所以我要問。

這是他的代碼:

<div class="scrollableTable">
<center><table class="font1" border="3px solid white" width="70%">
    <thead> 
    <tr id="tblRow">
        <th id="tblData" width="20%">Access Date</td>
        <th id="tblData" width="15%">ID number</td>
            <th id="tblData" width="35%">Name</td>
        <th id="tblData" width="20%">Keyword</td>
    </tr>
    </thead>
   <?php
  if ($_POST['search_projects']){

  $con= mysql_connect("...","...","...") or die ('Error: ' . mysql_error()); 
   mysql_select_db("...");
   $sql= "SELECT * FROM statisticData WHERE accessDate LIKE '%" . $_POST['StartD'] . "%' AND  accessDate LIKE '%" . $_POST['EndD'] . "%' ORDER BY accessDate DESC";
   $result= mysql_query($sql); 

    while($row= mysql_fetch_object($result))
    { 
    $Date=$row->accessDate; 
    $ID=$row->IDnum;
    $Name=$row->Sname; 
            $Key=$row->keyWord;

    echo "<tr>"; 
    echo "<td>" . $Date.  " </td>" . " <td>" . $ID.  " </td>" . " <td>" . $Name.  " </td>". " <td>" . $Key.  " </td>"; 
    echo "</tr>"; 

    }
    echo "</table>";
    echo "</center>";
    }
 ?>
 </div>

他希望允許用戶使用這些日期輸入來瀏覽數據庫的內容。

開始和結束日期輸入

問題是,即使選擇開始日期和結束日期,所有內容也會顯示在表格中。 他的查詢根本不過濾結果。 我告訴他不要睡,但他一直在煩我。 那么,您認為他應該怎么做才能最終入睡?

人的問題是名字:

$sql= "SELECT * FROM statisticData WHERE accessDate LIKE '%" . $_POST['Date1'] . "%' OR accessDate LIKE '%" . $_POST['Date2'] . "%' ORDER BY accessDate ASC";

也:

<form method="post">
<input type="date" name="Date1" value="<?php echo $_POST['Date1'] ?>" style="position:absolute; top:2em; left:7em;">
<p style="font-family:Calibri; color:green; font-size:15px; position: absolute; top: 1em; left: 18em;">to</p>
<input type="date" name="Date2" value="<?php echo $_POST['Date2'] ?>" style="position:absolute; top:2em; left:23em;"><br />
<input type="submit" id="Sbtn" style="cursor: pointer;" name="search_projects" value="Search">
</form>


更新:

  • 我們必須為MySQL轉換時間
  • 並使用BETWEEN語句


<?php
    if ($_POST['search_projects']){

    $startDate = date("Y-m-d", strtotime($_POST['Date1']));
    $endDate   = date("Y-m-d", strtotime($_POST['Date2']));

    $con= mysql_connect("...","...","...") or die ('Error: ' . mysql_error()); 
    mysql_select_db("...");
    $sql= "SELECT * FROM statisticData WHERE accessDate BETWEEN '$startDate' AND '$endDate' ORDER BY accessDate DESC";
    $result= mysql_query($sql); 
    ...

使用BETWEEN

$sql= "
    SELECT * 
    FROM statisticData 
    WHERE accessDate BETWEEN '{$_POST['StartD']}' AND '{$_POST['EndD']}
    ORDER BY accessDate ASC
";

並且請閱讀如何防止PHP中的SQL注入?

看起來不錯嘗試使用這個

$sql= "SELECT * FROM statisticData WHERE accessDate LIKE '" . $_POST['StartD'] . "' OR accessDate LIKE '" . $_POST['EndD'] . "' ORDER BY accessDate ASC";

或使用

$sql= "SELECT * FROM statisticData WHERE accessDate BETWEEN '" . $_POST['StartD'] . "' AND '" . $_POST['EndD'] . "' ORDER BY accessDate ASC";

用這個

$sql= "SELECT *
FROM `statisticData`
WHERE (accessDate BETWEEN '".$_POST['StartD']."' AND '" . $_POST['EndD'] . "') ORDER BY accessDate ASC";

我認為這是一種不良做法,原因有以下三個:

1)您這里有一個SQL注入漏洞-您必須轉義輸入

2)如果您在數據庫中使用datetime格式,但想按日期選擇而不帶時間-您應該使用DATE()類的函數轉換類型

3)使用LIKE語句比精確比較要慢得多,這是您需要的BETWEEN語句。 LIKE主要用於僅字符串類型的數據類型

accessDate列的數據類型是日期時間,還是字符串? 如果是日期時間,請嘗試以下操作:

'SELECT * FROM `statisticData`
 WHERE  (accessDate BETWEEN ' . $_POST['StartD'] . ' AND ' . $_POST['EndD']) .
'ORDER BY accessDate ASC'

它應該工作,我現在是sql guru

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM