Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В. Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5. На примерах. Авторы: Кузнецов М.В., Симдянов И.В., Голышев С.В. Социальная инженерия и социальные хакеры. Авторы: Кузнецов М.В., Симдянов И.В. PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум MySQL

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: UPDATE завел в тупик
 
 автор: egorr   (13.01.2008 в 00:46)   письмо автору
 
 

Помогите разобраться...

Пишу небольшой сайт. Там должен быть раздел Вопрос-Ответ.
Страница добавления в Вопрос-Ответ никаких затруднений не вызвала.
А вот редактирование сообщений застопорилось на UPDATE.
Ни за что не хочет апдатить! Целый день искал ошибку, все перепробывал, всё что касается UPDATE прочитал, по сети в поисках решения пошлялся... Без толку...
Страница выбора сообщения для редактирования наполняется списком из базы, вставляя попутно в ссылку на обработчик ID выбранного сообщения.

<a href=edit_faq_dg.php?idfaq='.$row['id_faq'].'>Редактировать</a>

На странице обработчика беру ID из $_GET['idfaq'].

$id = $_GET['idfaq'];

По полученному ID выбираю записи ему соответствующие.

$query = "SELECT * FROM faq  WHERE id_faq= '$id'";

Раскладываю их по формам (method="POST").
До сих пор все молотит как надо.
Юзер жмет submit.
Получаю

$question = $_POST['question'];
$answer =  $_POST['answer'];
$hide = $_POST['hide'];.

Пишу запрос на UPDATE


           $query = "UPDATE  `faq` SET  
                            question ='$question',
                            answer ='$answer'  
                            WHERE id_faq =$id";
            
$query_result  = mysql_query($query);
  if(!$query_result ) 
   die ("Невозможно выполнить: " .mysql_error()); 
и т. д.

И ничего не происходит... данные нипочем не желают обновляться!
Меня эта проблема уже достала! Решение наверняка окажется простым до банальности, но я него сам найти уже отчаялся.
Что я напорол, где косяк, надоумьте!...

   
 
 автор: jbs   (13.01.2008 в 01:37)   письмо автору
 
   для: egorr   (13.01.2008 в 00:46)
 

выглядит все правельно
только почему

$hide = $_POST['hide'];. 

а не ..

$id = $_POST['id'];. 
или
$id = $_POST['idfaq'];


и собстенно вобще через форму id передаеш?

   
 
 автор: EGORR   (13.01.2008 в 11:26)   письмо автору
 
   для: jbs   (13.01.2008 в 01:37)
 

Спасибо за интерес к моей проблеме.
$hide - это состояние сообщения(Скрыть/Отобразить).
А по поводу ID, то я пробовал брать для запроса UPDATE значение ID переданное в адресе $_GET['idfaq']; и полученное в результате запроса $row['id_faq'].
Пробовал значение ID в <input> класть, и для запроса UPDATE брать оттуда.
Выводил из формы редактированный текст на страницу, проверял права юзера.
Смахивал все и писал с первой строчки заново.
Все делал!...
Ничго не помогло!
Ни фига на понимаю!...

   
 
 автор: Trianon   (13.01.2008 в 12:09)   письмо автору
 
   для: EGORR   (13.01.2008 в 11:26)
 

>Все делал!...
Вот и показали бы фрагменты файлов

   
 
 автор: EGORR   (13.01.2008 в 12:39)   письмо автору
 
   для: Trianon   (13.01.2008 в 12:09)
 

Вот пожалуйста....

<?php require_once('../../../www/config.php');
  
$id intval($_GET['idfaq']);
  
$query "SELECT * FROM faq  WHERE id_faq= '$id'";
 
  
$result mysql_query($query);
  
$row mysql_fetch_array($result);
?>

<form action="<? echo $PHP_SELF?>" method="POST" style="margin:5px">
ID<br />
<input name="id" type="text" id="id" value="<?php echo $row['id_faq']; ?>" size="50" />
<br>
Вопрос<br />
<textarea name="question" cols="50" rows="3"  id="question"><?php echo $row['question']; ?></textarea>
<br>Ответ<br />
<textarea name="answer"cols="50" rows="3"  id="answer"><?php echo $row['answer']; ?></textarea>
<br>
  Статус сообщения<br />
     <select name="hide" id="hide">
     <option value="show" <?php if (!(strcmp("show"$row['hide']))) {echo "selected=\"selected\"";} ?>>ВКЛЮЧЕН</option><option value="hide" <?php if (!(strcmp("hide"$row['hide']))) {echo "selected=\"selected\"";} ?>>ВЫКЛЮЧЕН</option>
  </select>
<br /><br />
<input type="submit" name="faq_button" id="faqe_button" value="Изменить">
</form>
<?php

$id_1 
=  $row['id_faq'];
$question $_POST['question'];
$answer =  $_POST['answer'];
$hide $_POST['hide']; 
   
$link mysql_connect($dblocation,$dbuser,$dbpasswd);
   
$db mysql_select_db($dbname,$link);
           
$query "UPDATE  `faq` SET  
                            question ='.
$question.',
                            answer ='.
$answer.'  
                            WHERE id_faq ='.
$id.'";
            
$query_result  mysql_query($query$link);
  if(!
$query_result 
   die (
"Невозможно выполнить: " .mysql_error());
    echo 
"<h2>Запись обновлена ".mysql_affected_rows()."</h2>";


?>

   
 
 автор: Trianon   (13.01.2008 в 14:21)   письмо автору
 
   для: EGORR   (13.01.2008 в 12:39)
 

Переменная $id , используемая в строке WHERE id_faq ='.$id.'"; должна брать (где-то раньше) свое значение из (вероятно) $_POST['id'] . Того самого, что формируется строкой <input name="id" type="text" id="id" . Кстати type здесь разумно поставить не text, a hidden.

У Вас этого оператора ( $id = intval($_POST['id']); ) нет.

На самом деле, логическое разделение скрипта на ветвь, создающую форму, и ветвь, обрабатывающую post-запрос, в Вашем тексте практически отсутствует. Этак недолго и самому запутаться и других в ступор вогнать.

Вы строку <option растянули на полкилометра специально , чтоб до кнопки "ответить" было "легче" дотягиваться?

   
 
 автор: EGORR   (13.01.2008 в 15:50)   письмо автору
 
   для: Trianon   (13.01.2008 в 14:21)
 

2Trianon

Спасибо за совет.
Однако...

> Переменная $id , используемая в строке WHERE id_faq ='.$id.'"; должна брать (где-то раньше) свое значение из (вероятно) $_POST['id']

Совершенно справедливо. Только GET, а не POST. Может это служить причиной косяка? Я пробовал и POST, не помогло, но может я что-то не так делал...

> У Вас этого оператора ( $id = intval($_POST['id']); ) нет.

Этот оператор у меня в коде есть(см. цитату). Но ошибка остается.

> логическое разделение скрипта на ветвь, создающую форму, и ветвь, обрабатывающую post-запрос, в Вашем тексте практически отсутствует.

Я только начинаю осваивать PHP. Многих вещей не знаю. Учту. А как в данном конкретном коде это разделить?
Я считал, что код расположен логично, поэтапно:приходит с ГЕТом переменная, по ней идет запрос в БД, далее результат запроса раскладывается по формам, юзер правит, submit жмет, из полей данные идут в переменные, потом в БД...
В такой последовательности и код написан. Почему это худо? Как надо?

> Вы строку <option растянули на полкилометра специально , чтоб до кнопки "ответить" было "легче" дотягиваться?

Слышатся язвительные нотки... Нет, код написан нормально. Скопировалось так...

Так что же мне делать с этим UPDATE? Который день с ним бодаюсь.


Добавляю позже.

Сейчас средствами phpMyAdmin был сделан запрос.


UPDATE `faq` SET `question` = 'Какие новости?',
`answer` = 'Нет никаких новостей' WHERE `id_faq` = '44' 


Без малейших замечаний. Ни один МуСкуL не дрогнул!
Значит ошибка в PHP! Круг сузился.
Проблему это не решает, но надежду дает!

   
 
 автор: jbs   (13.01.2008 в 17:27)   письмо автору
 
   для: EGORR   (13.01.2008 в 15:50)
 

Выведи перед запросом в базу, значение $ID и ты увидеш что его нет.

echo '<h1>'.$id.'</h1>';


а второй косяк в запросе, точки зачем-то понапихал.

$query = "UPDATE faq SET question ='$question', answer ='$answer' WHERE id_faq ='$id'";

   
 
 автор: jbs   (13.01.2008 в 18:10)   письмо автору
 
   для: jbs   (13.01.2008 в 17:27)
 

и того:


<?php require_once('../../../www/config.php'); 
  
$id intval($_GET['idfaq']); 
  
$query "SELECT * FROM faq  WHERE id_faq= '$id'"
  
  
$result mysql_query($query); 
  
$row mysql_fetch_array($result); 
?> 

<form action="<? echo $PHP_SELF?>" method="POST" style="margin:5px"> 
ID<br /> 
<input name="id" type="text" id="id" value="<?php echo $row['id_faq']; ?>" size="50" /> 
<br> 
Вопрос<br /> 
<textarea name="question" cols="50" rows="3"  id="question"><?php echo $row['question']; ?></textarea> 
<br>Ответ<br /> 
<textarea name="answer"cols="50" rows="3"  id="answer"><?php echo $row['answer']; ?></textarea> 
<br> 
  Статус сообщения<br /> 
     <select name="hide" id="hide"> 
     <option value="show" <?php if (!(strcmp("show"$row['hide']))) {echo "selected=\"selected\"";} ?>>ВКЛЮЧЕН</option><option value="hide" <?php if (!(strcmp("hide"$row['hide']))) {echo "selected=\"selected\"";} ?>>ВЫКЛЮЧЕН</option> 
  </select> 
<br /><br /> 
<input type="submit" name="faq_button" id="faqe_button" value="Изменить"> 
</form> 
<?php 
$id 
$_POST['id'];
$question $_POST['question']; 
$answer =  $_POST['answer']; 
$hide $_POST['hide'];  
   
$link mysql_connect($dblocation,$dbuser,$dbpasswd); 
   
$db mysql_select_db($dbname,$link); 
   
$query "UPDATE faq SET question ='$question', answer ='$answer' WHERE id_faq ='$id'";
             
$query_result  mysql_query($query$link); 
  if(!
$query_result )  
   die (
"Невозможно выполнить: " .mysql_error()); 
    echo 
"<h2>Запись обновлена ".mysql_affected_rows()."</h2>"


?> 


даже проверил, работает

   
 
 автор: EGORR   (13.01.2008 в 18:22)   письмо автору
 
   для: jbs   (13.01.2008 в 18:10)
 

Это я от полного отчаянья все возможные и невозможные варианты написания пробовал.
Убрал я эти точки.
Делал обработку mysql_real_escape_string-ом, trim-ом. Все бесполезно!
Не работает!....

Сейчас твою науку применю.
Спасибо, сенсей!

   
 
 автор: EGORR   (13.01.2008 в 19:54)   письмо автору
 
   для: EGORR   (13.01.2008 в 18:22)
 

Спасибо!
Всё молотит!
Ура!

   
 
 автор: Faraon   (13.01.2008 в 21:01)   письмо автору
 
   для: jbs   (13.01.2008 в 18:10)
 

>id_faq= '$id'
Если у Вас $id должно быть числом, зачем нужны одинарные кавычки?

   
 
 автор: Unkind   (13.01.2008 в 21:23)   письмо автору
 
   для: jbs   (13.01.2008 в 18:10)
 

> <? echo $PHP_SELF; ?>
Неопределенная переменная

> if (!(strcmp("show", $row['hide'])))
Что за? Тут нужен просто оператор сравнения (==).

>$id = $_POST['id'];
>$question = $_POST['question'];
>$answer = $_POST['answer'];
>$hide = $_POST['hide'];
> $link = mysql_connect($dblocation,$dbuser,$dbpasswd);
> $db = mysql_select_db($dbname,$link);
> $query = "UPDATE faq SET question ='$question', answer ='$answer' WHERE id_faq ='$id'";


SQL Injections

   
 
 автор: EGORR   (14.01.2008 в 13:28)   письмо автору
 
   для: Unkind   (13.01.2008 в 21:23)
 

Unkind,
>SQL Injections< поясни, что имеешь в виду.
Я новичок...

   
 
 автор: Unkind   (14.01.2008 в 14:12)   письмо автору
 
   для: EGORR   (14.01.2008 в 13:28)
 

Об этом написано довольно много. Так что говорить что это за уязвимость я не стану.

Скажу пару слов о способах правильной обработки данных.
Если режим magic_quotes_gpc включен, то надо исправить всё, что натворил этот механизм с входящими данными.
А данные перед вставкой в запрос нужно экранировать и обрамлять кавычками, кроме числовых значений, которые нужно (если нет проверок) принудительно приводить к integer/float.

<?php
function stripslashes_recursive($value)
{
    if( 
is_array($value) )
    {
        
$value array_map('stripslashes_recursive'$value);    
    }
    else
    {
        
$value stripslashes($value);
    }

    return 
$value;
}

if( 
get_magic_quotes_gpc() )
{
    
$_POST stripslashes_recursive$_POST ); //$_GET, $_COOKIE
}

// ...

$id = isset( $_POST['id'] ) ? (int) $_POST['id'] : 0;

// ...

$query "UPDATE `faq` SET `question` = '" mysql_escape_string($question) . "', `answer` = '" mysql_escape_string($answer) . "' WHERE `id_faq` = " $id ";";
?>

   
 
 автор: EGORR   (14.01.2008 в 17:14)   письмо автору
 
   для: Unkind   (14.01.2008 в 14:12)
 

Спасибо, Unkind.
Буду разбираться...

   
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования