2011-12-31 191 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,另一個也需要這樣做。

相關問題