php: sql-запрос — избежать ошибки

#php #mysql #error-handling

#php #mysql #обработка ошибок

Вопрос:

я написал небольшой класс базы данных, который выглядит следующим образом:

 class dbClass extends mysqli
{
    public function execute($sq)
    {
    $res = parent::query($sq);
    $rs = $res->fetch_array();
    return $rs; 
    }
}
  

работает до сих пор, но проблема заключается в выполнении запроса на удаление («удалить из mytable, где ..»)
класс выдает ошибку в этой строке: $ rs = $res->fetch_array(); (поскольку, я думаю, это ничего не возвращает)

вопрос в том, как я могу перехватить эту ошибку? он просто не должен выполнять fetch_array() для запросов типа insert, delete, update ..

Спасибо!

Комментарии:

1. один из вариантов передать функции действие, подобное delete , и в соответствии с этим не выполнять fetch_array, другой вариант — отделить функцию для каждого действия

2. Вы планируете получать только первую строку, возвращаемую запросом, или вам нужен массив, содержащий все строки из запроса?

Ответ №1:

Для других типов инструкций SQL, INSERT, UPDATE, DELETE, DROP и т.д., mysql_query() возвращает TRUE при успешном выполнении или FALSE при ошибке.

вы должны проверить тип результата, если это логический тип, который не извлекается.

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

     public function execute($sq)
    {
      $res = parent::query($sq);
      if (is_bool($res))
      {
       //not to fetch
      }
      else
      {
        $rs = $res->fetch_array();
      }

      return $rs; 
    }
  

Ответ №2:

что такое parent::код запроса?

Вы можете просто проверить, присутствует ли массив, используя isset в вашей fetch_array() функции, и вернуть пустой массив или null, если он не установлен.

Ответ №3:

Другие библиотеки PHP используют две разные функции. PDO Например, PHP использует PDO::query для запросов, которые возвращают набор результатов (т.Е. SELECT ) и PDO::exec для запросов, которые не возвращают никаких результатов, кроме количества затронутых строк (т.Е. UPDATE , DELETE и так далее).

Ответ №4:

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

Когда вы пишете свой собственный класс БД, используйте возможность различать запросы на запись и чтение. Преобразуйте их в разные функции. Таким образом, вы сможете более легко масштабировать базу данных, используя простую репликацию базы данных master-slave, поскольку вы всегда хотите выполнять запись в master, но считывать с одного из подчиненных устройств. Вы также упрощаете переключение на другие расширения базы данных, такие как PDO.

Ответ №5:

Я предполагаю, что в этом случае $res возвращает null , поэтому проверьте это:

 $res ? $rs = $res->fetch_array() : $rs = $res;
  

Комментарии:

1. Нет, тот же код не будет работать. Что происходит, когда значение $res равно «true»?

2. Вы правы. Отредактировано, чтобы отразить это. Код работает, только если $res возвращает null значение или массив.

Ответ №6:

Я бы настоятельно предостерег от функции, в которой нет проверки ошибок. Итак, вот мое предложение — этот код будет возвращать массив в каждом случае. В случае ошибки в массиве будет только одна строка, содержащая «Error» в измерении [0] и сообщение об ошибке в измерении [1].

Если запрос не возвращает результат, код вернет [0] = «OK» и [1] = количество затронутых строк.

Если запрос действительно возвращает результат, код создаст результирующий набор, содержащий возвращенные строки.

 $retarray = array();

    $result = $mysqli->query($sq);
    if (!$result) {
       $err = $mysqli->error;
       echo $err;
        $retarray = array(array("Error",$err));

        return $retarray;
    }else {
        if (is_bool($result)){
            $retarray = array(array("OK",$mysqli->affected_rows));

        return $retarray;
        }else{
             while ($row = $result->fetch_array()) {
            array_push($retarray,$row);
        }
        }

        $result->close();
        return $retarray;
    }