Я могу обнаружить и обработать MySQL Warnings с PHP?

Когда вы объявляете ссылочную переменную (т. е. объект), вы действительно создаете указатель на объект. Рассмотрим следующий код, в котором вы объявляете переменную примитивного типа int:

int x;
x = 10;

В этом примере переменная x является int, и Java инициализирует ее для 0. Когда вы назначаете его 10 во второй строке, ваше значение 10 записывается в ячейку памяти, на которую указывает x.

Но когда вы пытаетесь объявить ссылочный тип, произойдет что-то другое. Возьмите следующий код:

Integer num;
num = new Integer(10);

Первая строка объявляет переменную с именем num, но она не содержит примитивного значения. Вместо этого он содержит указатель (потому что тип Integer является ссылочным типом). Поскольку вы еще не указали, что указать на Java, он устанавливает значение null, что означает «Я ничего не указываю».

Во второй строке ключевое слово new используется для создания экземпляра (или создания ) объекту типа Integer и переменной указателя num присваивается этот объект. Теперь вы можете ссылаться на объект, используя оператор разыменования . (точка).

Exception, о котором вы просили, возникает, когда вы объявляете переменную, но не создавали объект. Если вы попытаетесь разыменовать num. Перед созданием объекта вы получите NullPointerException. В самых тривиальных случаях компилятор поймает проблему и сообщит вам, что «num не может быть инициализирован», но иногда вы пишете код, который непосредственно не создает объект.

Например, вы можете имеют следующий метод:

public void doSomething(SomeObject obj) {
   //do something to obj
}

В этом случае вы не создаете объект obj, скорее предполагая, что он был создан до вызова метода doSomething. К сожалению, этот метод можно вызвать следующим образом:

doSomething(null);

В этом случае obj имеет значение null. Если метод предназначен для того, чтобы что-то сделать для переданного объекта, целесообразно бросить NullPointerException, потому что это ошибка программиста, и программисту понадобится эта информация для целей отладки.

Альтернативно, там могут быть случаи, когда цель метода заключается не только в том, чтобы работать с переданным в объекте, и поэтому нулевой параметр может быть приемлемым. В этом случае вам нужно будет проверить нулевой параметр и вести себя по-другому. Вы также должны объяснить это в документации. Например, doSomething может быть записано как:

/**
  * @param obj An optional foo for ____. May be null, in which case 
  *  the result will be ____.
  */
public void doSomething(SomeObject obj) {
    if(obj != null) {
       //do something
    } else {
       //do something else
    }
}

Наконец, Как определить исключение & amp; причина использования Трассировки стека

11
задан Kyle Noland 21 October 2014 в 20:34
поделиться

6 ответов

Для предупреждений, которые будут "отмечены" к PHP исходно, потребовал бы изменений в mysql/mysqli драйвере, который, очевидно, выходит за рамки этого вопроса. Вместо этого Вы оказываетесь перед необходимостью в основном проверять каждый запрос, который Вы делаете на базе данных для предупреждений:

$warningCountResult = mysql_query("SELECT @@warning_count");
if ($warningCountResult) {
    $warningCount = mysql_fetch_row($warningCountResult );
    if ($warningCount[0] > 0) {
        //Have warnings
        $warningDetailResult = mysql_query("SHOW WARNINGS");
        if ($warningDetailResult ) {
            while ($warning = mysql_fetch_assoc($warningDetailResult) {
                //Process it
            }
        }
    }//Else no warnings
}

Очевидно, это будет ужасно дорогим для применения en-массы, таким образом, Вы, возможно, должны были бы тщательно думать о том, когда и как предупреждения могут возникнуть (который может привести Вас осуществлять рефакторинг для устранения их).

Для ссылки, MySQL SHOW WARNINGS

Конечно, Вы могли обойтись без начального запроса для SELECT @@warning_count, который сохранил бы Вас запрос на выполнение, но я включал его для педантичной полноты.

11
ответ дан 3 December 2019 в 06:49
поделиться

Во-первых, необходимо выключить предупреждения так, чтобы посетители не видели ошибок MySQL. Во-вторых, когда Вы звоните mysql_query(), необходимо проверить, чтобы видеть, возвратило ли это false. Если это сделало, звонить mysql_errno() узнать, что пошло не так, как надо. Соответствуйте числу, возвращенному к кодам ошибок на этой странице.

Похоже, что это - код ошибки, который Вы ищете:

Ошибка: 1169 SQLSTATE: 23000 (ER_DUP_UNIQUE)

Сообщение: не Может записать, из-за ограничения на уникальность данных, к таблице '%s'

4
ответ дан 3 December 2019 в 06:49
поделиться

в зависимости от того, что (если таковые имеются) платформа Вы используете, я предлагаю, чтобы Вы сделали запрос, чтобы проверить на jobname сами и создать надлежащую информацию пользователю в с остальной частью проверок для формы.

В зависимости от количества jobnames Вы могли отправить имена к представлению, которое содержит форму, и используйте JavaScript для сообщения использования, которое взято.

Если это не имеет смысла Вам, то суммировать мое представление, это - это: не разрабатывайте свою программу и / или пользователь, чтобы попытаться сделать недопустимые вещи и зафиксировать ошибки, когда они сделают и обработают ее затем. Намного лучше, по моему скромному мнению, разработать Вашу систему для не создания ошибок. Сохраните ошибки к фактическим ошибкам :)

0
ответ дан 3 December 2019 в 06:49
поделиться

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

Одна вещь в MySQL для опасаний для UPDATE операторы: mysqli_affected_rows() возвратит нуль даже если WHERE пункт соответствовал строкам, но SET пункт на самом деле не изменил значения данных. Я только упоминаю это, потому что то поведение вызвало ошибку в системе, я когда-то смотрел на - программист использовал то возвращаемое значение для проверки ошибок после обновления, предполагая, что нуль означал, что некоторая ошибка произошла. Это просто означало, что пользователь не изменил существующих значений прежде, чем нажать кнопку обновления.

Таким образом, я предполагаю использование mysqli_affected_rows() не может быть положен для нахождения таких предупреждений также, если у Вас нет чего-то как update_time столбец в Вашей таблице, которой будут всегда присваивать новое значение метки времени при обновлении. Такое обходное решение кажется видом kludgey все же.

0
ответ дан 3 December 2019 в 06:49
поделиться

Вы можете обнаружить нарушения уникального ключа, используя оператор mysqli номер ошибки. Оператор mysqli возвращает ошибку 1062, то есть ER_DUP_ENTRY. Вы можете найти ошибку 1062 и распечатать подходящее сообщение об ошибке. Если вы хотите распечатать свой столбец (jobName) также как часть сообщения об ошибке, вам следует проанализировать строку ошибки оператора.

  if($stmt = $mysqli->prepare($sql)){
            $stmt->bind_param("sss",
            $name,
            $identKey,
            $domain);


            $stmt->execute();
            if($mysqli->affected_rows != 1)  {
                        //This will return errorno 1062
                trigger_error('mysql error >> '.$stmt->errno .'::' .$stmt->error, E_USER_ERROR);
                exit(1);
            }
            $stmt->close();
        } else {

            trigger_error('mysql error >> '. $mysqli->errno.'::'.$mysqli->error,E_USER_ERROR);
        }
0
ответ дан 3 December 2019 в 06:49
поделиться

С помощью mysqli можно получать предупреждения, причем более эффективным способом, чем с помощью mysql.

Вот код, предложенный на странице руководства на php.net для свойства mysqli-> warning_count:

$mysqli->query($query);

if ($mysqli->warning_count) {
    if ($result = $mysqli->query("SHOW WARNINGS")) {
        $row = $result->fetch_row();
        printf("%s (%d): %s\n", $row[0], $row[1], $row[2]);
        $result->close();
    }
}
0
ответ дан 3 December 2019 в 06:49
поделиться
Другие вопросы по тегам:

Похожие вопросы: