Может ли кто-нибудь помочь мне понять, почему этот код обновления 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);
?>

Вот что говорят журналы ошибок

[Пн, 14 марта, 13:08:55 2011] [ошибка] [клиент -] Файл не существует: /public_html/favicon.ico

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

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

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

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

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

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


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
Здесь много неизвестного. Вы проверили, что в БД есть таблица под названием 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, нам также нужно увидеть вашу настройку variable_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