[英]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.