2011-03-14 27 views
0

這是代碼。它似乎在PHP 5中有問題。它在PHP 4.4.9中運行良好。有人可以幫我理解爲什麼這個MySQL更新代碼不工作php 5

if($_REQUEST['action']== "Update"){ 

    $curDate = date("Y-m-d"); 
    $image =$_FILES['vImage']["name"]; 
    $uploadedfile = $_FILES['vImage']['tmp_name']; 


$sql="UPDATE businessad 
     SET iBUserID= '$_REQUEST[iBUserID]', 
      iCategoryID= '$_REQUEST[iBCategoryID]', 
      vAdTitle= '$_REQUEST[vAdTitle]', 
      tAdText= '$_REQUEST[tAdText]', 
      vAdImage= '$vAdImage', 
      vAdURL= '$_REQUEST[vAdURL]', 
      dStartDate= '$_REQUEST[dStartDate]', 
      dEndDate= '$_REQUEST[dEndDate]', 
      vAddress1= '$_REQUEST[vAddress1]', 
      vAddress2= '$_REQUEST[vAddress2]', 
      vCity= '$_REQUEST[vCity]', 
      vState= '$_REQUEST[vState]', 
      vZipCode= '$_REQUEST[vZipCode]', 
      vPhone= '$_REQUEST[vPhone]', 
      vEmail= '$_REQUEST[vEmail]', 
      eStatus='$_REQUEST[eStatus]' 

     WHERE iBusAdID='".$_REQUEST['iBusAdID']."'"; 

$db_sql=$obj->sql_query($sql); 

if($db_sql) 
{ 
    $msg=MSG_UPDATE; 
    header("Location:businessadview.php?var_msg=$msg"); 
    exit; 
} 
else 
{ 
    $msg=MSG_UPDATE_ERROR; 
    header("Location:businessadview.php?var_msg=$msg"); 
    exit; 

該代碼不會更新到MySQL表,我不知道爲什麼。

什麼先於上面的代碼看起來像這樣

<form name="frmadd" method="post" action="businessadadd_a.php" enctype="multipart/form-data"> 
<input type="hidden" name="action" value="<?=$action;?>"> 
<input type="hidden" name="iBusAdID" value=<?=$iBusAdID;?>> 

檢查我的服務器錯誤日誌,發現這一種形式。它提到了globals.php中的一些錯誤,這是包含調用的一部分。我也會包括包含代碼。

這裏是包括代碼

<?php 

@session_start(); 

@ob_start(); 

include_once("./lib/db_config.php"); 

include_once("./lib/myclass.php"); 

include_once("./lib/globals.php"); 

    if(!isset($obj)){ 

    $obj = new myclass($SERVER,$DBASE,$USERNAME,$PASSWORD); 

    } 

include_once("./lib/generalsettings.php"); 

include_once("./function/general.php"); 

include_once("./lib/messages.php"); 

getGeneralVar(); 

?> 

這裏是globals.php代碼服務器錯誤日誌有一個問題與

<?php 

    $glob=array("SERVER"); 

if(isset($GPC_vars)) 
{ foreach($GPC_vars as $var) 
    { foreach(array("GET","POST","COOKIE") as $avar) 
     if(isset($GLOBALS["HTTP_".$avar."_VARS"][$var])) 
     { $$var=$GLOBALS["HTTP_".$avar."_VARS"][$var]; 
     } 
    }    
} 
else 
{ $glob=array_merge(array("GET","POST","COOKIE"),$glob); 
} 

foreach($glob as $avar) 
{ $arr=$GLOBALS["HTTP_".$avar."_VARS"]; 
    foreach($arr as $var => $res) 
     $$var=$res; 
} 

foreach ($HTTP_POST_FILES as $name => $value) { 
    $$name = $value["tmp_name"]; 
    foreach($value as $k=>$v) { 
     $varname_ = $name."_".$k; 
     $$varname_ = $v; 
    } 
} 
reset($HTTP_POST_FILES); 
?> 

這裏是什麼錯誤日誌說

[Mon Mar 14 13:08:55 2011] [error] [client - ]文件不存在:/public_html/favicon.ico

[Mon Mar 14 13:08:54 2011] [錯誤] [客戶端 - ] PHP警告:reset()[function.reset]:通過變量不是數組或對象在/public_html/lib/globals.php在線30,referer:xxx.com/admin/businessadadd.php?iBusAdID=4 & action = Update

[Mon Mar 14 13:08:54 2011] [error] [client - ] PHP警告:提供了無效參數foreach()in .../public_html/lib/globals.php on line 23,referer:xxx.com/admin/businessadadd.php?iBusAdID=4 & action = Update

[Mon Mar 14 13:08: 54 2011年] [錯誤] [客戶端 - ] PHP警告:無效參數爲foreach()在.../public_html/lib/globals.php第19行,referer:xxx.com/admin/businessadadd.php?iBusAdID= 4 & action = Update

[Mon Mar 14 13:08:54 2011] [error] [client - ] PHP警告:在.../public_html/lib/globals.php中爲foreach()提供了無效參數19,referer:xxx.com/admin/businessadadd.php?iBusAdID=4 & action = Update

[Mon Mar 14 13:08:54 2011] [error] [client - ] PHP警告:提供了無效參數foreach()in .../public_html/lib/globals.php on line 19,referer:xxx.com/admin/businessadadd.php?iBusAdID=4 & action = Update

[Mon Mar 14 13:08: 54 2011年] [錯誤] [客戶端 - ] PHP警告:無效參數爲foreach()在.../public_html/lib/globals.php on line 19,referer:xxx.com/admin/businessadadd.php?iBusAdID=4 & action = Update

+0

你在sql上調用了mysql_query嗎?你打電話給mysql_connect了嗎? – 2011-03-14 00:44:24

+0

PHP 5改變了GET/POST/etc變量寫入REQUEST超級全局的順序。在查詢字符串和表單提交中是否有重複的變量?另外,我會把所有這些變量替換放在字符串之外(比如最後一個iBusAdID),並且顯然會確保數據被驗證/清理。 – Fosco 2011-03-14 00:48:05

+0

這裏有很多未知的東西。你有沒有檢查數據庫有一個名爲businessad的表?你如何連接到數據庫?是否有與數據庫的連接?數據庫中列出了所有的字段嗎?如果任何字段不完全如何在數據庫中,那麼這也可能導致問題... – Jason 2011-03-14 01:15:12

回答

0

您可能會嘗試在查詢中使用您在末尾處進行的級聯。它可以看作$_REQUEST['SOMETHING']作爲一個字符串。

$sql = "UPDATE businessad 
      SET iBUserID = '".$_REQUEST['iBUserID']."', 
       iCategoryID = '".$_REQUEST['iBCategoryID']."',  
       vAdTitle = '".$_REQUEST['vAdTitle']."', 
       tAdText = '".$_REQUEST['tAdText']."', 
       vAdImage = '$vAdImage', 
       vAdURL = '".$_REQUEST['vAdURL']."', 
       dStartDate = '".$_REQUEST['dStartDate']."', 
       dEndDate = '".$_REQUEST['dEndDate']."', 
       vAddress1 = '".$_REQUEST['vAddress1']."', 
       vAddress2 = '".$_REQUEST['vAddress2']."', 
       vCity = '".$_REQUEST['vCity']."', 
       vState = '".$_REQUEST['vState']."', 
       vZipCode = '".$_REQUEST['vZipCode']."', 
       vPhone = '".$_REQUEST['vPhone']."', 
       vEmail= '".$_REQUEST['vEmail']."', 
       eStatus = '".$_REQUEST['eStatus']."'  
     WHERE iBusAdID = '".$_REQUEST['iBusAdID']."'"; 
2

因爲它只是一個字符串。你執行查詢嗎?如果是這樣,mysql_error告訴你什麼?

而且,拜託,請相信,Google for SQL注入。此代碼非常脆弱。

+0

我會立即嘗試迴應,看看它是否有任何錯誤。現在,它什麼也沒說。該頁面只是空白,沒有任何更新到SQL表。我有它通常輸出一條消息,說「更新完成」。我對編程也很新穎,所以我必須將SQL注入的煩惱放在我的清單上以涵蓋安全性。謝謝。 – 2011-03-14 01:00:45

+1

@Richard aka cyberkiwi。它怎麼沒有? mysql_error很可能會返回有關此查詢或任何其他語句的有用信息。在從PHP 4遷移到5時會出現很多錯誤,最好的辦法應該是檢查查詢是否有效(數據是如何發佈的,它是否完全一樣,處理也是一樣),如果mysql功能正常工作。這可能不是一個完整的答案,由於缺乏信息而幾乎不可能完成,但這是一個認真的嘗試,指出OP在正確的方向。 – GolezTrol 2011-03-14 01:08:40

+2

好吧,你似乎還沒有完全消化我的答案。但是我至少在努力建設性的時候,因爲前幾句話就開始下調了。對不起,我花了你的積分... – GolezTrol 2011-03-14 09:32:21

0

當你說你的代碼在PHP4,但在PHP5停止工作,那麼它很容易認爲這是由於缺乏magic_quotes的。此功能已在PHP5的默認配置中禁用。由於缺少轉義,您的SQL查詢現在變得無效。

在腳本的開始(但之後的mysql_connect)增加以下內容:

$_REQUEST = array_map("mysql_real_escape_string", $_REQUEST); 

它的解決方法十歲上下,但如果是數據庫連接後立即執行總是至少是安全的。如果必須,請爲$ _GET和$ _POST執行相同操作。 (正確的做法是遷移到PDO和參數化的SQL,或至少應用mysql_real_escape_string功能無論您連接SQL查詢。)

+0

我沒有在該行代碼之前的mysql_connect代碼,因爲我有一個包含文件,它會使用連接參數自動加載到每個頁面上。 – 2011-03-14 01:02:40

+0

在mysql_connect之後添加array_map片段。如果它在單獨的連接文件中,則在那裏執行。 – mario 2011-03-14 01:07:28

+0

現在似乎沒有太多的工作。 – 2011-03-14 03:15:48

2

原因的失敗是由您的聲明中解釋說:

我不知道爲什麼

1)你引用用於生成查詢的代碼片段 - 但我們需要看到它獲取發送到數據庫的結構查詢表

2)我們還需要查看查詢失敗後返回的錯誤消息。

3)因爲使用了$ _REQUEST,我們也需要看到您的variables_order設置兩個PHP的安裝,以確定$ _REQUEST如何填充

我希望,一旦你找到答案,這些解決方案將是顯而易見。但值得注意的是,將用戶提供的數據拼接到SQL查詢中是一個非常糟糕的主意 - 您對SQL注入攻擊敞開大門。

+0

嗨,我已經更新了問題,以顯示發送信息到sql表的條件。我還顯示錯誤日誌的內容,以及錯誤日誌中的受影響代碼。 PHP 4.4.9服務器的variables_order表示0,而php 5.2.14表示EGPCS – 2011-03-14 20:32:30

+0

這裏是表結構 - iBusAdID,iBUserID,iCategoryID,vAdTitle,tAdText,vAdImage,vAdURL,dStartDate,dEndDate,eStatus,\t vAddress1,vAddress2,vEmail,vCity,vState,vPhone,vZipCode – 2011-03-14 20:47:37

相關問題