这是代码。它似乎在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和;行动=更新
答案 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查询。)