簡體   English   中英

有人可以幫助我了解為什么此MySQL更新代碼無法正常工作php 5

[英]Could someone help me understand why this MySQL update code isn't working php 5

這是代碼。 在PHP 5中似乎有問題。在PHP 4.4.9中效果很好。

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中的一些錯誤,這是include調用的一部分。 我也將包括包含代碼。

這是包含代碼

<?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);
?>

這是錯誤日志所說的

[2011年3月14日星期一13:08:55] [錯誤] [客戶端-]文件不存在:/public_html/favicon.ico

[2011年3月14日星期一13:08:54] [錯誤] [客戶端-] PHP警告:reset()[function.reset]:第30行的/public_html/lib/globals.php中傳遞的變量不是數組或對象,引薦網址:xxx.com/admin/businessadadd.php?iBusAdID=4&action=Update

[2011年3月14日星期一13:08:54] [錯誤] [客戶端-] PHP警告:第23行的... / public_html / lib / globals.php中為foreach()提供了無效參數,引用網址:xxx.com/管理員/ businessadadd.php?iBusAdID = 4&行動=更新

[2011年3月14日星期一13:08:54] [錯誤] [客戶端-] PHP警告:在第19行的... / public_html / lib / globals.php中為foreach()提供了無效的參數,引用網址:xxx.com/管理員/ businessadadd.php?iBusAdID = 4&行動=更新

[2011年3月14日星期一13:08:54] [錯誤] [客戶端-] PHP警告:在第19行的... / public_html / lib / globals.php中為foreach()提供了無效的參數,引用網址:xxx.com/管理員/ businessadadd.php?iBusAdID = 4&行動=更新

[2011年3月14日星期一13:08:54] [錯誤] [客戶端-] PHP警告:在第19行的... / public_html / lib / globals.php中為foreach()提供了無效的參數,引用網址:xxx.com/管理員/ businessadadd.php?iBusAdID = 4&行動=更新

[2011年3月14日星期一13:08:54] [錯誤] [客戶端-] PHP警告:在第19行的... / public_html / lib / globals.php中為foreach()提供了無效的參數,引用網址:xxx.com/管理員/ businessadadd.php?iBusAdID = 4&行動=更新

因為它只是一個字符串。 您執行查詢嗎? 如果是這樣,mysql_error會告訴您什么?

拜托,相當高興的是,Google進行了SQL注入。 此代碼非常容易受到攻擊。

您的陳述解釋了其失敗的原因:

我不確定為什么

1)您引用了用於生成查詢的代碼片段-但是我們需要查看查詢,該查詢已發送到數據庫以及表的結構

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

3)由於您使用的是$ _REQUEST,因此我們還需要查看兩個PHP安裝的variables_order設置,以確定如何填充$ _REQUEST

我希望一旦找到這些答案,解決方案就會很明顯。 但也值得注意的是,將用戶提供的數據拼接到SQL查詢中是一個非常糟糕的主意-您對SQL注入攻擊持開放態度。

您可能會嘗試使用查詢最后使用的連接。 可能是將$_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']."'";

當您說您的代碼可在PHP4中運行但停止在PHP5中運行時,則很容易假設這是由於缺少magic_quotes所致。 PHP5的默認配置中已禁用此功能。 由於缺少轉義,您的SQL查詢現在變得無效。

在腳本的開頭(但在mysql_connect之后)添加以下內容:

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

這是一種解決方法,但如果始終在數據庫連接后立即執行,則至少是安全的。 如果需要,對$ _GET和$ _POST進行相同的操作。 (正確的方法是遷移到PDO和參數化的SQL,或者至少連接SQL查詢的任何地方應用mysql_real_escape_string函數。)

暫無
暫無

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

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