#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;
}