Може ли някой да ми помогне да разбера защо този код за актуализиране на MySQL не работи 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, който е част от извикването за включване. Ще включа и кода за включване.

Ето кода за включване

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

[Mon Mar 14 13:08:54 2011] [грешка] [клиент -] PHP предупреждение: reset() [function.reset]: Подадената променлива не е масив или обект в /public_html/lib/globals.php на ред 30 , референт: xxx.com/admin/businessadadd.php?iBusAdID=4&action=Update

[Mon Mar 14 13:08:54 2011] [грешка] [клиент -] PHP предупреждение: Невалиден аргумент, предоставен за foreach() в .../public_html/lib/globals.php на ред 23, референт: xxx.com/ admin/businessadadd.php?iBusAdID=4&action=Update

[Mon Mar 14 13:08:54 2011] [грешка] [клиент -] Предупреждение за PHP: Предоставен е невалиден аргумент за foreach() в .../public_html/lib/globals.php на ред 19, референт: xxx.com/ admin/businessadadd.php?iBusAdID=4&action=Update

[Mon Mar 14 13:08:54 2011] [грешка] [клиент -] Предупреждение за PHP: Предоставен е невалиден аргумент за foreach() в .../public_html/lib/globals.php на ред 19, референт: xxx.com/ admin/businessadadd.php?iBusAdID=4&action=Update

[Mon Mar 14 13:08:54 2011] [грешка] [клиент -] Предупреждение за PHP: Предоставен е невалиден аргумент за foreach() в .../public_html/lib/globals.php на ред 19, референт: xxx.com/ admin/businessadadd.php?iBusAdID=4&action=Update

[Mon Mar 14 13:08:54 2011] [грешка] [клиент -] Предупреждение за PHP: Предоставен е невалиден аргумент за foreach() в .../public_html/lib/globals.php на ред 19, референт: xxx.com/ admin/businessadadd.php?iBusAdID=4&action=Update


person Big Freeze    schedule 14.03.2011    source източник
comment
Извикахте ли mysql_query на sql? Извикахте ли mysql_connect?   -  person Chris Muench    schedule 14.03.2011
comment
PHP 5 промени реда, в който променливите GET/POST/etc се записват в суперглобалния REQUEST. Има ли дублиращи се променливи в низа на заявката и подаването на формуляр? Освен това бих поставил ВСИЧКИ тези замествания на променливи извън низа (както е последният iBusAdID) и очевидно бих се уверил, че данните са валидирани/дезинфекцирани.   -  person Fosco    schedule 14.03.2011
comment
Тук има много неизвестни. Проверихте ли, че db има таблица, наречена businessad? Как се свързвате с базата данни? Има ли връзка с базата данни? Всички полета, които сте посочили, в базата данни ли са? Ако някое от полетата не е точно както го имате в базата данни, това също може да причини проблеми...   -  person Jason    schedule 14.03.2011
comment
базата данни има тази таблица. Има връзка към базата данни във включен файл. Всички изброени полета са в базата данни. Ето защо ме притеснява, че не се актуализира. Опитвам фрагмента array_map, предложен по-долу.   -  person Big Freeze    schedule 14.03.2011
comment
@Big Freeze: Можете ли просто да поставите този ред: echo $sql; веднага след горния ред във вашия код и ни кажете какво показва в браузъра? php може да записва действителна грешка в регистрационен файл за грешки (дефиниран във вашия php.ini) и затова екранът ви остава празен.   -  person anubhava    schedule 14.03.2011
comment
@anubhava, проверих регистрационните файлове на сървъра си и изглежда имам проблем с файла globals.php. Публикувах кода там. Мисля, че проблемът е с преминаването през масива.   -  person Big Freeze    schedule 15.03.2011


Отговори (4)


Може да опитате да използвате конкатенацията, която правите в края на заявката. Може да погледнете $_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']."'";
person Jason    schedule 14.03.2011

Защото това е просто низ. Изпълнявате ли заявката? Ако е така, какво ви казва mysql_error?

И моля, много моля, Google за SQL инжекция. Този код е много уязвим.

person GolezTrol    schedule 14.03.2011
comment
Ще пробвам ехото веднага, за да видя дали казва някаква грешка. В момента не казва нищо. Страницата просто остава празна и нищо не се актуализира в sql таблицата. Обикновено извежда съобщение, което казва, че актуализацията е завършена. Освен това съм доста нов в програмирането, така че трябва да поставя притесненията за SQL инжектиране в списъка си с неща, които трябва да покрия за сигурност. Благодаря. - person Big Freeze; 14.03.2011
comment
@Ричард известен още като киберкиви. Как не е mysql_error може много добре да върне полезна информация за тази заявка или всяко друго изявление. Има много неща, които могат да се объркат при миграцията от PHP 4 към 5 и най-добрият въпрос трябва да бъде да проверите дали заявката е валидна (как се публикуват данните, същите ли са и се обработват по същия начин) и дали mysql функциите работят правилно. Може да не е пълен отговор, което е почти невъзможно поради липсата на информация, но е сериозен опит да се насочи OP в правилната посока. - person GolezTrol; 14.03.2011
comment
Е, изглежда, че не сте усвоили напълно отговора ми. Но там, където поне се опитах да бъда конструктивен, вие просто започнахте да гласувате против заради първите няколко думи. Съжалявам, че ви коствах точки... - person GolezTrol; 14.03.2011

Причината за неуспеха му се обяснява с вашето изявление:

и не съм сигурен защо

1) вие сте цитирали фрагмент от кода, използван за генериране на заявката - но трябва да видим заявката, която се изпраща до базата данни и структурата на таблицата

2) ние също трябва да видим съобщението за грешка, което се връща, след като заявката е неуспешна.

3) тъй като използвате $_REQUEST, ние също трябва да видим вашата настройка variables_order и за двете PHP инсталации, за да определим как се попълва $_REQUEST

Очаквам, че след като намерите отговорите на тези въпроси, решението ще бъде очевидно. Но също така си струва да се отбележи, че сливането на предоставени от потребителя данни в SQL заявка е много лоша идея - вие сте широко отворени за атаки с инжектиране на SQL.

person symcbean    schedule 14.03.2011
comment
Здравейте, актуализирах въпроса, за да покажа условието, което изпраща информацията към sql таблицата. Също така показвам какво пише в регистрационните файлове за грешки и засегнатия код от регистрационните файлове за грешки. variables_order за сървъра php 4.4.9 казва 0, докато този за php 5.2.14 казва EGPCS - person Big Freeze; 14.03.2011
comment
Ето структурата на таблицата - iBusAdID, iBUserID, iCategoryID, vAdTitle, tAdText, vAdImage, vAdURL, dStartDate, dEndDate, eStatus, vAddress1, vAddress2, vEmail, vCity, vState, vPhone, vZipCode - person Big Freeze; 14.03.2011

Когато кажете, че кодът ви работи в 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 заявки.)

person mario    schedule 14.03.2011
comment
Нямам кода mysql_connect пред този ред код, защото имам включен файл, който се зарежда автоматично на всяка страница с параметрите за свързване. - person Big Freeze; 14.03.2011
comment
Добавете фрагмента array_map след mysql_connect. Ако е в отделен файл за свързване, направете го там. - person mario; 14.03.2011