Mysql ошибка при обновлении записи - PullRequest
0 голосов
/ 29 декабря 2011

Я выполняю следующее, просто чтобы проверить, правильно ли я понял эту часть сценария, у меня уже есть запись, которая выглядит следующим образом в базе данных 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

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

Я не вижу причины, по которой вышеприведенный запрос не удался, кроме моегоплохое кодирование (вероятно, проблема), поскольку в БД есть только одна запись с этими двумя полями = 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());
?>

Ответы [ 3 ]

2 голосов
/ 29 декабря 2011

Ваше утверждение ОБНОВЛЕНИЕ неверно.Это должно быть записано как:

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

Итак ...

$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']) . "'";
1 голос
/ 29 декабря 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]'
0 голосов
/ 15 ноября 2012

Лучший способ сделать это, используя ON DUPLICATE

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

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

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

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

...