php
  • mysql
  • forms
  • 2013-05-06 4 views 1 likes 
    1

    У меня есть 4 вопроса, которые запускаются на сообщение. Я заметил, что не все запросы работают, если у одного из первых запросов нет работы.понимание php die с mysql_error

    Вот мои запросы

    mysql_query("UPDATE invoice SET company='$company' WHERE company='$oldcompanyname'") or die(mysql_error()); 
    
    mysql_query("UPDATE bill SET customer='$company' WHERE customer='$oldcompanyname'") or die(mysql_error()); 
    
    mysql_query("UPDATE project SET customer='$company' WHERE customer='$oldcompanyname'") or die(mysql_error()); 
    
    mysql_query("INSERT INTO activity_log (item, date) VALUES ('Customer Editted', NOW()) ") or die(mysql_error()); 
    

    Чтобы дать вам пример, первый работает нормально. Но второй не имеет работы, потому что данных в поле не существует. Третий и четвертый должны бежать, но они этого не делают.

    Я всегда привык добавлять мои запросы с помощью «или умереть (mysql_error())»; но я сейчас думаю, что это не лучший выбор. Но не должны ли остальные запросы работать, даже если в середине нет работы?

    Если есть работа, выполняемая во всех 4, то она отлично работает.

    +1

    'die()' в основном выходит из скрипта, вы должны знать только имя. Так что если второй не удастся, скрипт перестанет исполняться, поэтому 3-й и 4-й не будут выполнены! – HamZa

    +2

    Второй не должен получать ошибку только потому, что нет соответствующей строки. – Barmar

    +0

    Ах забыл сказать, что die является эквивалентом 'exit()', и вы можете отправить сообщение клиенту, и именно поэтому вы используете mysql_error для отображения ошибки. – HamZa

    ответ

    4

    @ HamZa DzCyberDeV прав, если один из ваших первых запросов не удался, вызов die() остановит остальную часть вашего скрипта от выполнения так же, как exit(). Вы намного лучше удаляете инструкцию die и используете if/else в тех случаях, когда вам нужно запускать запрос только в том случае, если выполняется другое.

    $result = mysql_query("UPDATE invoice SET company='$company' WHERE company='$oldcompanyname'"); 
    if ($result !== false) { 
        // do something here or execute the next query 
    } 
    

    Кроме того, не используйте функции mysql_ * в новом коде http://bit.ly/phpmsql. Они больше не поддерживаются и официально устарели https://wiki.php.net/rfc/mysql_deprecation. Узнайте о Подготовленных заявлениях http://j.mp/T9hLWi и используйте PDO http://php.net/pdo или MySQLi http://php.net/mysqli.

    +2

    Но запрос, который не имеет ничего общего, не должен вызывать 'mysql_query' сбой. Он не работает, если в запросе есть ошибка. Обычно это происходит из-за ошибки в программе, например, не сбегая от ввода правильно, и уместно умереть. – Barmar

    +0

    Хм. Не заголовок и, кажется, сейчас работает, не знаю почему. Я закрыл и снова открыл браузер. Может ли это иметь какое-либо отношение к сеансам? – Tom

    +0

    @Barmar Вы правы. Он также может потерпеть неудачу, если он ожидает определенный тип данных, например, попытку вставить строку в поле int и т. Д. Или превысить длину своего типа данных. Он не проверяет опубликованные данные, которые мы можем видеть в его коде. – Revent

    1

    Похоже, вы должны просто нормализовать свои данные. Если бы вы ваш стол клиент связан на основе офф ID, вы можете просто сделать:

    UPDATE `company` SET name='$new_name' WHERE company_id=$id 
    

    , а затем в таблицах счета/счетов/проекта вы бы внешний ключ для company_id, вместо того, чтобы основывать его прочь название компании.

    +0

    Спасибо за все ваши ответы. Думаю, я мог бы подкрасться к ответу. Возможно ли после смерти, что мое перенаправление заголовка может быть ногами?У меня есть следующее в верхней части моего скрипта. if ($ _ SERVER ['REQUEST_METHOD'] == "POST") { header ("Location: viewcustomers.php"); } – Tom

    +0

    Возможно. Некоторые браузеры перенаправляют, как только они видят перенаправление заголовка, некоторые ждут полного ответа (AFAIK) – dave

    +0

    В любом случае, если есть перенаправление, содержимое не будет отображаться. Вы не должны отправлять заголовок до тех пор, пока вы не обновите все успешно. – Barmar

     Смежные вопросы

    • Нет связанных вопросов^_^