2011-12-31 86 views
0

我正在处理的这段代码是检查数据库中是否有结束编辑的日期(说今天的日期是12/30/11编辑的最后日期是或是12/12/10 =锁定或今天的日期是12/30/11编辑的最后日期是或是12/12/13 =解锁&转发到编辑网站)检查数据库中的当前日期与日期

所以记住这个问题:代码我一直说您的帐户被锁定,无论锁定日期和我在一个失去了一个解决方案:(。

顺便说一句,请记住,头已经被这点发送。

<?php 
$id = $_GET['id']; 
// Define MySQL Information. 
$mysqlhost="***************"; // Host name of MySQL server. 
$mysqlusername="**********"; // Username of MySQL database. 
$mysqlpassword="*********"; // Password of the above MySQL username. 
$mysqldatabase="*************"; // Name of database where the table resides. 
// Connect to MySQL. 
mysql_connect("$mysqlhost", "$mysqlusername", "$mysqlpassword")or die("Could not connect to  MySQL."); 
mysql_select_db("$mysqldatabase")or die("Could not connect to selected MySQL database."); 

$infosql = "SELECT * FROM premiersounds_users WHERE customer_id = $id"; 
$inforesult = mysql_query($infosql) or die(mysql_error()); 
$info = mysql_fetch_array($inforesult); 


$l_date=$info['lockout_date']; 

//Get current date from server 
    $format="%m/%d/%y"; 
$c_date=strftime($format); 
//set sessions 
$_SESSION['current_date'] = $c_date; 
$_SESSION['lockout_date'] = $l_date; 

//Check is Current date = lockout date 
if ($c_date <= $l_date) { header("location:/planner_scripts/documnet_editors /edit_weddingplanner.php?id=$id"); } else {echo 'Whoops! Were sorry your account has been locked to edits because your event is less than 48 hours from now or your event has passed. To make changes to your event please contact your DJ.'; echo'<br/>'; echo ' Todays Date: ';echo $c_date; echo ','; echo ' Last Date for edits: '; echo $l_date;} 
?> 
<?php 
//Destroy Session for Lockout Date to prevent by passes 
unset($_SESSION['lockout_date']); 
?> 
+0

首先,因为它存在于您的代码是大规模开放** SQL注入** – rdlowrey 2011-12-31 04:42:59

+0

如果你在谈论,我们把有ID的网址是什么?它并不是一个真正值得关注的问题,因为编辑页面会检查cookie对应的Cookie和会话数据,这些数据在他们登录时设置,而不会在这里看到。 – 2011-12-31 04:48:28

+0

总是有人担心......无论如何,回答即将讨论这一点。 – rdlowrey 2011-12-31 04:49:08

回答

1

几件事情......

  1. 因为它发布的代码是SQL注入攻击 大规模开放。在将数据包含在 数据库查询中之前,您应始终对用户数据进行清理。我在 下面的代码中添加了一个mysql_escape_string()调用,以防止出现这种情况,并提及一个简单的整型转换。有 其他方式来实现这一点。您可以通过在 上搜索SO来了解该主题。
  2. 比较日期的一个简单方法是使用PHP的DateTime类。 下面的代码创建DateTime的实例...其中一个用于 当前日期,另一个来自从 数据库检索的锁定日期。一旦你有这些对象,你可以比较这两个。

<?php 
$id = $_GET['id']; 
// Define MySQL Information. 

$mysqlusername=""; // Username of MySQL database. 
$mysqlpassword=""; // Password of the above MySQL username. 
$mysqldatabase=""; // Name of database where the table resides. 
// Connect to MySQL. 
mysql_connect("$mysqlhost", "$mysqlusername", "$mysqlpassword")or die("Could not connect to  MySQL."); 
mysql_select_db("$mysqldatabase")or die("Could not connect to selected MySQL database."); 

// IMPORTANT: PREVENT SQL INJECTION 
$id = mysql_escape_string($id); 
// Or, if $id is supposed to be an integer just do this ... 
// $id = (int) $id; 

$infosql = "SELECT * FROM premiersounds_users WHERE customer_id = $id"; 
$inforesult = mysql_query($infosql) or die(mysql_error()); 
$info = mysql_fetch_array($inforesult); 

//Get current date from server 
$c_date = new DateTime(); 
$l_date = new DateTime($info['lockout_date']); 

//Check is Current date = lockout date 
if ($c_date->format('Y-m-d') <= $l_date->format('Y-m-d')) { 
    header("location:/planner_scripts/documnet_editors/edit_weddingplanner.php?id=$id"); 
} else { 
    echo 'Whoops! Were sorry your account has been locked to edits because your event is less than 48 hours from now or your event has passed. To make changes to your event please contact your DJ.'; 
    echo'<br/>'; 
    echo ' Todays Date: '; 
    echo $c_date; 
    echo ','; 
    echo ' Last Date for edits: '; 
    echo $l_date; 
} 

?> 
1

您将日期比较为字符串。你正在比较12/30/2011类似12/11/2011或类似的东西。 PHP可以并且会做到这一点,但它会像字符串一样对待它们。

这会造成的主要奇怪之处在于0与数字类型没有关系。

此外,你的日期格式不匹配。 MySQL返回类似2011-12-30的东西,而你的strftime将做类似于30/12/2011的事情。

尝试像

$c_date_stamp = strtotime($c_date); 
$today = strtotime('today'); 

if($c_date_stamp <= $today) { } 

这将比较之前的日期以UNIX时间戳转换。另一种选择是将它们留在字符串形式中,但对可能产生的影响感到厌倦。

例如,如果你以字符串形式做到这一点,在日期部分的大小将需要按降序排列:

if($c_date <= date('Y-m-d')) 

还要注意的是,如果一个是天<使用前导零10,另一个也需要这样做。

相关问题