PHP + MySQL查询:意外的结果(仅针对少量结果)
尝试根据用户给出的开始日期和结束日期显示MySQL DB的结果。以下是代码:PHP + MySQL查询:意外的结果(仅针对少量结果)
//Getting Values From Other Page
$start_date = date("Y-m-d", strtotime($_GET["date3"]));
$end_date = date("Y-m-d", strtotime($_GET["date4"]));
//Server Connection Info
$server = "server_name";
$db_user = "username";
$db_pass = "pass";
$db_name = "dbname";
//Server Connection + Query
$link = mysql_connect($server,$db_user,$db_pass);
if(!$link)
{
die("Could Not Connect:".mysql_error());
}
mysql_select_db($db_name, $link) or die('Can\'t use db:'. mysql_error());
if ($start_date == $end_date){
$query = "SELECT col_a, col_b, col_c, col_d FROM main WHERE date='".$start_date."'";
}
else {
$query = "SELECT col_a, col_b, col_c, col_d FROM main WHERE date BETWEEN '".$start_date."' AND '".$end_date."'";
}
$result = mysql_query($query,$link) or die('Query Error'.mysql_error());
?>
<!-- HTML CODE STARTS HERE -->
<html>
<head>
<title></title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<link rel="stylesheet" href="qc_style.css" />
<link href='http://fonts.googleapis.com/css?family=Days+One' rel='stylesheet' type='text/css' />
</head>
<body>
<?php
$row = mysql_fetch_assoc($result);
$row_count = mysql_num_rows($result);
echo $row;
echo $row_count;
if($row_count!=0){
echo "<table>";
while($row = mysql_fetch_assoc($result))
{
echo "<tr><td>";
foreach($row as $value)
{
echo $value;
echo "</td><td>";
}
echo "<a href=\"qc_campedit.php?id=".$row['call_id']."\">Edit</a></td></tr>";
}
echo "</table>";
} //end of if statement
else {echo " Sorry, No records match your query";}
?>
</body>
</html>
我有两行数据在我的数据库日期2011-08-25和一行数据的日期2011-08-24。
- 当我指定开始日期和结束日期为2011-08-24时,我没有得到 响应。
- 但是,当我指定开始日期和结束日期为2011-08-25时,我的 只得到一行数据属于2011-08-25
- 当我指定开始日期为2011-08-24结束日期为2011-08-25 ,我得到属于2011-08-25的两行数据和属于2011-08-25的行。
- 然而,当我指定的开始日期和结束日期为2011-08-23,我得到的所有的20行数据属于2011-08-23
注:阵列的数量在$result
的特定时间范围内显示正确。即2011-08-24的$ row_count = 1和2011-08-24的$ row_count = 2
如何解决此问题?提前致谢。
如果您想要选择较少的列,请不要使用“SELECT * FROM ...”而是使用“SELECT name_of_col_A,name_of_col_B FROM table ...”。
另外我建议通过$ _REQUEST消毒你接受的日期字符串并传入你的查询。东西沿线
$start_date = date("Y-m-d", strtotime($_REQUEST["date3"]));
应该就足够了。
修改了查询和日期,结果仍然相同。 –
BETWEEN
只是一种指定包含范围的方法。我认为在db中你的列有DATETIME
列,所以BETWEEN '2011-08-24' AND '2011-08-24'
只返回'2011-08-24 0:00:00'的记录。做你想要的东西你需要写WHERE DATE(your_datetime_column) BETWEEN '2011-08-24' AND '2011-08-24'
不是,该列仅为DATE列,不是DATETIME。 –
只需要添加一件事。如果您知道您的数据来自哪里,请特别使用该来源,并避免使用$ _REQUEST。
它本身并不危险,但在某些情况下,它可能会带来安全风险,因为它使用了可能实际上将数据从您不想去的地方拉出的备用系统。即$ _REQUEST跟随你EGPCS设置,如果没有请求的数据在$ _ENV向前移动到$ _GET,$ _ POST,$ _COOKIE等发现,你不希望出现这种情况,这意味着。
如果你的数据是专门从未来GET然后用$_GET['date3']
谢谢你,不知道安全问题。使用GET现在.. –
您对mysql_fetch_assoc第一()的调用获取的第一行。然后你进入你的循环,第一个取出的是下一行,这是第一行。我稍微更新了下面的代码以使用mysql_num_rows()来显示您的结果数量。
<?php
$row_count = mysql_num_rows($result);
echo $row_count;
if($row_count==0) {
echo "Sorry, no records match your query";
else {
echo "<table>";
while($row = mysql_fetch_assoc($result))
{
echo "<tr><td>";
foreach($row as $value)
{
echo $value;
echo "</td><td>";
}
echo "<a href=\"qc_campedit.php?id=".$row['call_id']."\">Edit</a></td></tr>";
}
echo "</table>";
}
?>
谢谢你,修改了代码,但仍然没有得到正确的结果。 $ row_count表示2(感谢mysql_num_rows($ result)),但只有一行正在显示......这似乎是$ result中行数较少的情况。 –
对不起,没有仔细检查你的三个useCases。 但首先我在你的代码中看到,你只是为了知道“row_count”而获取第一行。 我增加了一些评论对这段:
$row = mysql_fetch_assoc($result); // get row 1 from mysql-result
$row_count = count($row); // always the number of attributes returned in one row
echo $row;
echo $row_count;
if($row_count!=1) { // always true
// fetch lines 2-n and write to table
}
使用mysql_num_rows()如果你需要返回的行数。
谢谢你。修改了代码。 –
什么是日期列的数据类型? –
日期列的数据类型为DATE –