Перейти к содержимому



Простой вопрос: почему не работает UPDATE?

#1 hnerd
hnerd
  • Неактивные
  • 284 сообщений
  • Репутация: 18
0

Обновлено 24 апреля 2015 - 20:10  Отправлено 18 августа 2014 - 09:00

Здравствуйте! Не можете мне помочь. У меня не работает UPDATE, причину не могу найти!

<?php
require_once('dbconfig.php');
$id = $_GET['id'];
//Делаем выборку
$res = mysql_query("SELECT * FROM articles WHERE id_article='$id'");
if(!$res) die ('Ошибка базы данных ' . mysql_error());
$row = mysql_fetch_assoc($res);
?>
<h1>Обновление записи!</h1>
<form method="post" action="update.php">
    <input type="text" name="title" value="<?php echo $row['title']; ?>" /><br/>
    <textarea name="content"><?php echo $row['content']; ?></textarea><br/>
    <input type="submit" name="change" value="Изменить" />
</form>
<br/><a href="index.php">Главная</a>
<?php
//Делаем обновление записей
if(isset($_POST['change']))
{
    $title = $_POST['title'];
    $content = $_POST['content'];
    $query = "UPDATE articles SET title='$title', content='$content' WHERE id_article='$id'";
    mysql_query($query);
}
?>

Если убрать

WHERE id_article='$id'

, то сразу все работает и записи обновляются у всех статей сразу-это понятно!
Выходит у меня ошибка именно в

WHERE id_article='$id'

Тогда я подумала, может $id у меня просто не работает, я вывела

echo $id;

- и мне вывели этот id! $id тоже существует, но UPDATE с WHERE id_article='$id' не работает!

В чем ошибка? Может в синтаксисе?

 

Но как-только не пробовала ставить кавычки-не помогает!

Все же вроде бы правильно!


 

 

Сообщение отредактировал hnerd: 18 августа 2014 - 09:03

  • 0

#2 fedornabilkin
fedornabilkin
  • Модератор
  • 1 191 сообщений
  • Репутация: 206

Отправлено 18 августа 2014 - 09:16

Попробуй сделать echo $query;

Посмотришь какой запрос формируется. Этот запрос можно выполнить в майадмине, там ошибку выдаст, если есть.


И привыкай сразу обрабатывать внешние данные. Например сделай отдельную функцию и все запросы прогоняй через нее.

function def($str){
    $str = trim($p); // пробелы не нужны
    $str = htmlentities($str); // символы в сущности
    return $str;
}
// а данные получаем так
$title = def($_POST['title']);

  • 1

Надо обсудить предложение. А тут знакосчиталка считает знаки. Про Yii2 написано.



#3 kamchatniyoleg
kamchatniyoleg
  • Пользователь PRO
  • 1 179 сообщений
  • Репутация: 84

Отправлено 18 августа 2014 - 10:15

Простой ответ 

$query = "UPDATE `articles` SET `title` = '".$title."', `content` = '".$content."' WHERE `id_article` = '".$id."'";

ну как то так . Также проверьте существует ли ID в таблице !


  • 1
Сервис электронного информирования клиентов PostTrail.ru
Отслеживание посылок Почты России в автоматическом режиме! Лояльность клиента - прибыль магазина!


#4 fedornabilkin
fedornabilkin
  • Модератор
  • 1 191 сообщений
  • Репутация: 206

Отправлено 18 августа 2014 - 10:58

Хочу обратить внимание, что такой запрос также верный. Потому что строка в двойных кавычках разборная и парсер видит в ней переменные.

$query = "UPDATE articles SET title='$title', content='$content' WHERE id_article='$id'";

Конкатенация обязательна в случае одинарных кавычек.


  • 0

Надо обсудить предложение. А тут знакосчиталка считает знаки. Про Yii2 написано.



#5 kamchatniyoleg
kamchatniyoleg
  • Пользователь PRO
  • 1 179 сообщений
  • Репутация: 84

Отправлено 18 августа 2014 - 10:59

fedornabilkin, В принципе вы правы . Но если посмотреть со стороны красоты и правильности оформления - тогда так правильнее .


  • 0
Сервис электронного информирования клиентов PostTrail.ru
Отслеживание посылок Почты России в автоматическом режиме! Лояльность клиента - прибыль магазина!


#6 fedornabilkin
fedornabilkin
  • Модератор
  • 1 191 сообщений
  • Репутация: 206

Отправлено 18 августа 2014 - 11:18

Да-да, согласен. Я так тоже раньше делал. Но когда приходится формировать большие запросы на 5-8 строк с джойнами, группированием и т.д., то очень легко запутаться с кавычками.

Поэтому решил писать запрос в двойных и переменные без кавычек. Но это было давно.

Сейчас написал для себя класс, который формирует запросы, а мне остается только передать данные в массиве вида

$data['field'] = $val;
$data['field1'] = $val1;
$data['field2'] = $val2;

Очень полезно, когда скрипт разрастается. Очень трудно найти все запросы и отредактировать их при необходимости.


  • 0

Надо обсудить предложение. А тут знакосчиталка считает знаки. Про Yii2 написано.



#7 kamchatniyoleg
kamchatniyoleg
  • Пользователь PRO
  • 1 179 сообщений
  • Репутация: 84

Отправлено 18 августа 2014 - 11:24

fedornabilkin, А зачем класс писать ? Может проще уже тогда ORM или AR ?


  • 0
Сервис электронного информирования клиентов PostTrail.ru
Отслеживание посылок Почты России в автоматическом режиме! Лояльность клиента - прибыль магазина!


#8 fedornabilkin
fedornabilkin
  • Модератор
  • 1 191 сообщений
  • Репутация: 206

Отправлено 18 августа 2014 - 11:36

Да вот проблема у меня. Все никак не могу вылезти из примитивного уровня. Может еще не готов.

Хотя понимаю, что это правильно и рационально.

Опять же надо сделать выбор и еще вот:

 

На практике всё не так просто и очевидно. Все системы ORM обычно проявляют себя в том или ином виде, уменьшая в некотором роде возможность игнорирования базы данных. Более того, слой транзакций может быть медленным и неэффективным (особенно в терминах сгенерированного SQL). Все это может привести к тому, что программы будут работать медленнее и использовать больше памяти, чем программы, написанные «вручную».


  • 0

Надо обсудить предложение. А тут знакосчиталка считает знаки. Про Yii2 написано.



#9 hnerd
hnerd
    Topic Starter
  • Неактивные
  • 284 сообщений
  • Репутация: 18

Отправлено 18 августа 2014 - 18:39

Простой ответ 

$query = "UPDATE `articles` SET `title` = '".$title."', `content` = '".$content."' WHERE `id_article` = '".$id."'";

ну как то так . Также проверьте существует ли ID в таблице !

Спасибо за ответ! К сожалению. так тоже не работает, id не хочет показывать! Когда вместо id цифру подставила, все заработало! Как вы думаете, как можно изменить код, чтобы id было видно!


Сообщение отредактировал hnerd: 18 августа 2014 - 18:59

  • 0

#10 Ixman
Ixman
  • Пользователь PRO
  • 3 177 сообщений
  • Репутация: 850

Отправлено 18 августа 2014 - 18:55

Выводите после запроса echo mysql_error();


  • 0


#11 hnerd
hnerd
    Topic Starter
  • Неактивные
  • 284 сообщений
  • Репутация: 18

Отправлено 18 августа 2014 - 19:13

Сработало, когда я сделала так: создала еще один input, куда вставила id, а потом просто методом пост забрала ее оттуда и вставила в UPDATE. Но так ведь тоже не совсем правильно, хоть и работает, как Вы думаете, что еще можно сделать. Пробовала даже сохранить id с помощью сессий и констант - не сохраняется. А вот, код, который получился у меня!

<?php
require_once('dbconfig.php');
$id = $_GET['id'];
//Делаем выборку
$res = mysql_query("SELECT * FROM articles WHERE id_article='$id'");
if(!$res) die ('Ошибка базы данных ' . mysql_error());
$row = mysql_fetch_assoc($res);
?>
<h1>Обновление записи!</h1>
<form method="post" action="update.php">
	Номер статьи:<br/>
	<input type="text" name="id" value="<?php echo $row['id_article']; ?>" /><br/>
	<input type="text" name="title" value="<?php echo $row['title']; ?>" /><br/>
	<textarea name="content"><?php echo $row['content']; ?></textarea><br/>
	<input type="submit" name="change" value="Изменить" />
</form>
<br/><a href="index.php">Главная</a>
<?php
//Делаем обновление записей
if(isset($_POST['change']))
{
	$title = $_POST['title'];
	$content = $_POST['content'];
	$id = $_POST['id'];
	$query = "UPDATE articles SET title='$title', content='$content' WHERE id_article='$id'";
	echo $id;
	mysql_query($query);
}
?>

  • 0

#12 fedornabilkin
fedornabilkin
  • Модератор
  • 1 191 сообщений
  • Репутация: 206

Отправлено 18 августа 2014 - 19:22


Как вы думаете, как можно изменить код, чтобы id было видно!

Легко и просто.

Код, который отвечает за изменение записи

if(isset($_POST['change'])){
    ...
}

Размести сразу после строки, где у тебя инициализируется $id

Потому что этот код все равно будет отрабатываться только после отправки формы.

Тогда у тебя айди будет точно видеть.


Я бы тебе еще рекомендавал бы отказаться от вставок пхп кода в хтмл код.

Потому что это не очень красиво, не совсем удобно  и когда дойдет дело до заголовков, то тебе придется все равно отказаться от этого. Или все равно когда-то познакомишься с шаблонизатором.

Поэтому в самом начале страницы пиши весь пхп, который нужен, а то, что надо вывести на страницу добавляй в переменную и потом выводи эту переменную.

echo $html;

Сообщение отредактировал fedornabilkin: 18 августа 2014 - 19:22

  • 1

Надо обсудить предложение. А тут знакосчиталка считает знаки. Про Yii2 написано.



#13 Ixman
Ixman
  • Пользователь PRO
  • 3 177 сообщений
  • Репутация: 850

Отправлено 18 августа 2014 - 19:47

Это вполне нормальный приём ID передавать POST методом, но его выводить не обязательно, можно делать так 

<input name="id" type="hidden" value="<?= $row['id_article']; ?>"><br />

  • 1


#14 vovanpadavan
vovanpadavan
  • Неактивные
  • 3 сообщений
  • Репутация: 0

Отправлено 24 апреля 2015 - 20:10

Напишите весь запрос в phpmyadmin к базе данных... увидите может ошибка в переменных

поставьте после echo mysql_error();


  • 0

robot
robot
  • Пользователь PRO
  • 2 652 сообщений
  • Репутация: 85


Похожие темы
  Название темы Автор Статистика Последнее сообщение

Пользователь месяца
Megoydagi Megoydagi 1-й за Август
Очков активности: 30 4 темы, 8 сообщений, 1 балл репутации
Сайт: bank.net.ru
ТОП самых активных за этот месяц
  • Фотография Vmir
    #1

    Vmir
    Очков активности: 22.5 3 темы, 6 сообщений, 1 балл репутации

  • Фотография BLIK
    #2

    BLIK
    Очков активности: 18 Вне конкурса за определение пользователя месяца

  • Фотография kuztoday
    #3

    kuztoday
    Очков активности: 10.5 1 тема, 4 сообщения, 1 балл репутации

  • Фотография SergiuS85
    #4

    SergiuS85
    Очков активности: 10.5 2 темы, 1 сообщение, 1 балл репутации

  • Фотография kolver
    #5

    kolver
    Очков активности: 9 1 тема, 3 сообщения, 1 балл репутации

  • Фотография mkreine
    #6

    mkreine (analiz-krovi.net)
    Очков активности: 9 1 тема, 3 сообщения, 1 балл репутации

  • Фотография Megoydagi
    #7

    Megoydagi (bank.net.ru)
    Очков активности: 9 Вне конкурса за определение пользователя месяца

  • Фотография wp01
    #8

    wp01
    Очков активности: 7.5 0 тем, 5 сообщений, 1 балл репутации

  • Фотография Totti
    #9

    Totti
    Очков активности: 7.5 0 тем, 5 сообщений, 1 балл репутации

  • Фотография fedornabilkin
    #10

    fedornabilkin (plohoneponyal.ru)
    Очков активности: 7.5 1 тема, 2 сообщения, 1 балл репутации

  • Показать весь ТОП 10

Поддержите форум! =)
Топ 5 участников по репутации

Оформление форума – IPBSkins.ru