Как получить MYSQLI подготовленный оператор PHP, PHP - PullRequest
9 голосов
/ 23 ноября 2011

Кажется, у меня проблема с получениемладанной вороной, когда я ВСТАВЛЯЮ и ВЫБИРАЮ, она просто возвращает -1 по какой-то причине?Я использую класс базы данных, который я использую все время для своих проектов, использующих операторы подготовки MYSQLI, чтобы избежать SQL-инъекций.

Кто-нибудь знает, почему он все время возвращает -1?из того, что я прочитал, он должен иметь возможность возвращать затронутые строки как на INSERT, так и на SELECT.

Класс базы данных

$class database {
protected $_mysqli;
protected $_debug;

public function __construct($host, $username, $password, $database, $debug) {
    $this->_mysqli = new mysqli($host, $username, $password, $database);
    $this->_debug = (bool) $debug;
    if (mysqli_connect_errno()) {
        if ($this->_debug) {
            echo mysqli_connect_error();
            debug_print_backtrace();
        }
        return false;
    }
    return true;
}

public function q($query) {
    if ($query = $this->_mysqli->prepare($query)) {
        if (func_num_args() > 1) {
            $x = func_get_args();
            $args = array_merge(array(func_get_arg(1)),
                array_slice($x, 2));
            $args_ref = array();
            foreach($args as $k => &$arg) {
                $args_ref[$k] = &$arg; 
            }
            call_user_func_array(array($query, 'bind_param'), $args_ref);
        }
        $query->execute();

        if ($query->errno) {
          if ($this->_debug) {
            echo mysqli_error($this->_mysqli);
            debug_print_backtrace();
          }
          return false;
        }

        if ($query->affected_rows > -1) {
            return $query->affected_rows;
        }
        $params = array();
        $meta = $query->result_metadata();
        while ($field = $meta->fetch_field()) {
            $params[] = &$row[$field->name];
        }
        call_user_func_array(array($query, 'bind_result'), $params);

        $result = array();
        while ($query->fetch()) {
            $r = array();
            foreach ($row as $key => $val) {
                $r[$key] = $val;
            }
            $result[] = $r;
        }
        $query->close(); 
        return $result;
    } else {
        if ($this->_debug) {
            echo $this->_mysqli->error;
            debug_print_backtrace();
        }
        return false;
    }
}

public function handle() {
    return $this->_mysqli;
}

public function last_insert_id()
{
    return $this->_mysqli->insert_id;
}

public function found_rowss()
{
    return $this->_mysqli->affected_rows;
}

}

1 Ответ

4 голосов
/ 23 ноября 2011

для операторов выбора, созданных с помощью prepare, следует использовать $query->num_rows() или mysqli_stmt_num_rows($query).

Оператор вставки может выдавать скрытые ошибки, когда вы делаете "INSERT IGNORE", что может привести к -1в $query->affected_rows().

В комментарии к php.net (вторая ссылка) предлагается использовать $query->sqlstate=="00000" для проверки ошибок.


см. php.net (manual / en / mysqli-stmt.affered-row) :

"Эта функция работает только с запросами, которые обновляют таблицу. Чтобы получить количество строк из запроса SELECT, используйте mysqli_stmt_num_rows() вместо этого."

и php.net (manual / en / mysqli.affered-row) :

"Проверка, будет ли mysqli-> disabled_rows равен -1 или нет, не является хорошим методомопределения успешности операторов "INSERT IGNORE" Пример: Игнорирование ошибок повторяющихся ключей при вставке некоторых строк, содержащих данные, предоставленные пользователем, только если они будут соответствовать указанному уникальному ограничению, вызывает возврат значения -1 на mysqli->affected_rows, даже если строки были вставлены. (проверенона окнах MySQL 5.0.85 linux и php 5.2.9-2). Однако mysqli->sqlstate не возвращает ошибки, если оператор был успешно выполнен. "

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...