Ошибка Mysql при обновлении записи

Я запускаю следующее просто в качестве теста, чтобы увидеть, правильно ли я понял эту часть скрипта, у меня уже есть запись, которая выглядит следующим образом в базе данных mysql: Если в моей форме я поместил вышеуказанную информацию в каждую из форм поля и нажмите «Отправить», что должно произойти, так это выбрать запись, которая равна опубликованному имени потенциального клиента и имени формы электронной почты, и обновить запись с тем же именем лидера и именем формы электронной почты с новой датой из поля [datesent] в форме.

Итак, я запускаю следующее:

<?php
$query = mysql_query("IF EXISTS(SELECT * FROM hqfjt_email_history WHERE     leadname='$_POST[leadname]' AND emailformname='$_POST[emailformname]') 
THEN UPDATE hqfjt_email_history (datesent) VALUES ('$_POST[datesent]') WHERE     emailformname='$_POST[emailformname]' AND leadname='$_POST[leadname]'
") or die(mysql_error());
?>

но вместо обновления этого поля я получаю сообщение об ошибке:

У вас есть ошибка в синтаксисе SQL; проверьте руководство, соответствующее версии вашего сервера MySQL, на предмет правильного синтаксиса для использования рядом с «ЕСЛИ СУЩЕСТВУЕТ (ВЫБЕРИТЕ * ИЗ hqfjt_email_history, ГДЕ leadname = «Брайан Кокс» И электронная почта» в строке 1

Кстати, я не могу использовать метод индекса без дублирования ключа для обновления записи по разным причинам, поэтому мне нужно идентифицировать запись по двум полям leadname и emailformname.

Я не вижу причины, по которой приведенный выше запрос не будет работать, кроме моей плохой кодировки (вероятно, проблема), поскольку в БД есть только одна запись с этими двумя полями = true.

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Спасибо всем за помощь, теперь это правильно, если я хочу вставить в пустую запись? Но я не уверен, как очистить мою часть, которую я добавил в конце?

 <?php
 $sql = "IF EXISTS (
        SELECT * FROM hqfjt_email_history 
        WHERE leadname= '" . mysql_real_escape_string($_POST['leadname']) . "' 
        AND emailformname = '" . mysql_real_escape_string($_POST['emailformname']) . "'
    ) 
    THEN
        UPDATE hqfjt_email_history 
        SET datesent = '" . mysql_real_escape_string($_POST['datesent']) . "'
        WHERE emailformname = '" . mysql_real_escape_string($_POST['emailformname']) . "' 
        AND leadname = '" . mysql_real_escape_string($_POST['leadname']) . "'
    ELSE
    INSERT INTO hqfjt_email_history
    (id, leadname, emailformname, datesent) VALUES     ('$_POST[id]','$_POST[leadname]','$_POST[emailformname]','$_POST[datesent]')";
$query = mysql_query($sql) or die(mysql_error());
?>

person Iain Simpson    schedule 29.12.2011    source источник
comment
Я думаю, вам следует подумать о очистке ваших значений сообщений, прежде чем сбрасывать их в свой запрос. Это предотвратит инъекцию.   -  person Wes Crow    schedule 29.12.2011


Ответы (3)


Ваше утверждение UPDATE неверно. Это должно быть написано как:

UPDATE <table>
SET <columnname> = <value>
WHERE <condition>

So...

$sql= "UPDATE hqfjt_email_history 
SET datesent = '" . mysql_real_escape_string($_POST['datesent']) . "'
WHERE emailformname = '" . mysql_real_escape_string($_POST['emailformname']) . "' 
AND leadname = '" . mysql_real_escape_string($_POST['leadname'] . "'"

Обратите внимание, что я добавил функцию mysql_real_escape_string() вокруг вашего переменные, чтобы избежать проблем с инъекциями и апострофами.

Итак, в конечном итоге ваш PHP должен быть:

$sql = "IF EXISTS (
            SELECT * FROM hqfjt_email_history 
            WHERE leadname= '" . mysql_real_escape_string($_POST['leadname']) . "' 
            AND emailformname = '" . mysql_real_escape_string($_POST['emailformname']) . "'
        ) 
        THEN 
            UPDATE hqfjt_email_history 
            SET datesent = '" . mysql_real_escape_string($_POST['datesent']) . "'
            WHERE emailformname = '" . mysql_real_escape_string($_POST['emailformname']) . "' 
            AND leadname = '" . mysql_real_escape_string($_POST['leadname']) . "'";
$query = mysql_query($sql) or die(mysql_error());

Тем не менее, я не понимаю, почему вы добавляете IF EXISTS ( ... ) в свой запрос. Потому что в основном вы просто проверяете, существует ли запись, и обновляете ее, если она существует. Но если вы сделаете ОБНОВЛЕНИЕ для несуществующей записи, она просто ничего не обновит... Так что она не может повредить записи

$sql = "UPDATE hqfjt_email_history 
            SET datesent = '" . mysql_real_escape_string($_POST['datesent']) . "'
            WHERE emailformname = '" . mysql_real_escape_string($_POST['emailformname']) . "' 
            AND leadname = '" . mysql_real_escape_string($_POST['leadname']) . "'";
person Jules    schedule 29.12.2011
comment
Привет, спасибо за это, я делаю, если он существует, потому что, если он не существует, я бы хотел, чтобы он его создал, поэтому я не уверен, что лучше вместо этого использовать замену? - person Iain Simpson; 29.12.2011
comment
Я добавил вставку в конце (вверху в редактировании), нужно ли мне дезинфицировать и последнюю часть, я не уверен, как вы дезинфицируете такую ​​​​строку значений, это так же, как вы сделали Это ? спасибо :-) . - person Iain Simpson; 29.12.2011
comment
Хорошо, с INSERT в конце имеет смысл сделать проверку. :) Да, дезинфекция — это то же самое, что и я, оборачивая mysql_real_escape_string() вокруг вашего параметра. - person Jules; 29.12.2011

Для этого можно использовать команду INSERT INTO... ON DUPLICATE KEY UPDATE...

С этой структурой MySQL попытается вставить запись, если возникнет ошибка с дублирующимся ключом, MySQL попытается обновить запись с помощью этого ключа.

Убедитесь, что ваш (уникальный/первичный) ключ установлен правильно.

INSERT INTO
  hqfjt_email_history 
SET
  leadname='$_POST[leadname]',
  emailformname='$_POST[emailformname]',
  datesent='$_POST[datesent]'
ON DUPLICATE KEY UPDATE
  leadname='$_POST[leadname]',
  emailformname='$_POST[emailformname]',
  datesent='$_POST[datesent]'
person JF Paris    schedule 29.12.2011
comment
Ошибка синтаксического анализа: синтаксическая ошибка, неожиданная T_STRING в C:\server2go\server2go\htdocs\chandlers\administrator\components\com_chronoforms\form_actions\custom_code\custom_code.php(18): код eval() в строке 2 - person Iain Simpson; 29.12.2011

Лучший способ сделать это с помощью ON DUPLICATE

Если строка уже существует, он обновляет ее.

Но будьте осторожны, синтаксис INSERT должен быть (например):

INSERT INTO table (val1,val2) 
VALUE ('123','abc')
ON DUPLICATE KEY UPDATE
val3='new'

Для некоторых обновлений статистики это очень полезно (с val3=val3+1)

person Valky    schedule 15.11.2012