有人可以帮我理解为什么这个MySQL更新代码不能正常运行php 5

时间:2011-03-14 00:42:59

标签: php mysql sql sql-update

这是代码。它似乎在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);
?>

以下是错误日志所说的内容

[Mon Mar 14 13:08:55 2011] [错误] [客户端 - ]文件不存在:/public_html/favicon.ico

[2011年3月14日13:08:54] [错误] [客户端 - ] PHP警告:reset()[function.reset]:传递的变量不是/public_html/lib/globals.php中的数组或对象在第30行,referer: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和;行动=更新

4 个答案:

答案 0 :(得分:2)

因为它只是一个字符串。你执行查询吗?如果是这样,mysql_error会告诉你什么?

请相信,Google for SQL注入。这段代码很容易受到攻击。

答案 1 :(得分:2)

你的陈述解释了失败的原因:

  

我不知道为什么

1)您已经引用了用于生成查询的代码片段 - 但是我们需要查看发送到数据库的查询表的结构

2)我们还需要查看查询失败后返回的错误消息。

3)因为您使用$ _REQUEST,我们还需要查看两个PHP安装的variables_order设置,以确定如何填充$ _REQUEST

我希望一旦你找到了解决这些问题的答案就会很明显。但是值得注意的是,将用户提供的数据拼接到SQL查询中是一个非常糟糕的主意 - 您对SQL注入攻击持开放态度。

答案 2 :(得分: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']."'";

答案 3 :(得分: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查询。)