prepare () vs query () mysqli - PullRequest
       5

prepare () vs query () mysqli

5 голосов
/ 24 августа 2010

Я пытаюсь понять разницу между запросами mysqli () и prepare (). У меня есть код, как показано ниже, и я хотел бы получить одинаковые результаты от обоих. Однако prepare () не работает должным образом. Зачем?

  // this works

  if ($query = $this->db->query("SELECT html FROM static_pages WHERE page = 'cities'")) {

     $result = $query->fetch_row();
     echo $result[0];

  $query->close();

  }

  //this does not work
  //result is empty

     $cities = 'cities';

     $stmt = $this->db->prepare("SELECT html FROM static_pages WHERE page = ?");
     $stmt -> bind_param("s", $cities);
     $stmt->execute();
     $stmt->bind_result($result);
     $stmt->fetch();
     echo $result;
     $stmt->close();

     $this->db->close();

это мои настройки сервера в соответствии с запросом:

OS

Vista 64bit / PHP Версия 5.2.9

MySQLi

Поддержка MysqlI включена

Клиентская библиотека API версии 5.0.51a

Версия заголовка API клиента 5.0.51a

MYSQLI_SOCKET /tmp/mysql.sock

Директива Local Value Master Value

mysqli.default_host нет значения нет значения

mysqli.default_port 3306 3306

mysqli.default_pw нет значения нет значения

mysqli.default_socket нет значения нет значения

mysqli.default_user нет значения нет значения

mysqli.max_links Неограниченно Неограниченно

mysqli.reconnect Выкл. Выкл.

Ответы [ 3 ]

2 голосов
/ 24 августа 2010

Можете ли вы попробовать $stmt->store_result(); между $stmt->execute(); и $stmt->bind_result($result);?

2 голосов
/ 24 августа 2010

Любая функций mysqli_ * может завершиться ошибкой.В этом случае возвращаемое значение равно false, а свойства error / errno объекта mysqli или mysqli_stmt содержат дополнительную информацию об ошибке.Сценарий должен проверять каждое возвращаемое значение и соответствующим образом реагировать на состояние ошибки (например, нет смысла подготавливать оператор, если соединение не удалось).

<?php
$foo = new Foo;
$foo->init();
$foo->bar();
class Foo {
  public function bar() {
    $cities = 'cities';  
    $stmt = $this->db->prepare("SELECT html FROM soTest WHERE page = ?");
    if ( !$stmt ) {
      echo "prepare failed\n";
      echo "error: ", $this->db->error, "\n";
      return;
    }

    $rc = $stmt->bind_param("s", $cities);
    if ( !$rc ) {
      echo "bind_param failed\n";
      echo "error: ", $stmt->error, "\n";
      return;
    }

    $rc=$stmt->execute();
    if ( !$rc ) {
      echo "execute failed\n";
      echo "error: ", $stmt->error, "\n";
      return;
    }

    $rc = $stmt->bind_result($result);
    if ( !$rc ) {
      echo "bind_result failed\n";
      echo "error: ", $stmt->error, "\n";
      return;
    }

    $rc = $stmt->fetch();
    if ( !$rc ) {
      echo "no such record\n";
    }
    else {
      echo 'result: ', $result, "\n";
    }
    $stmt->close();
  }

  public function init() {
    $this->db = new mysqli('localhost', 'localonly', 'localonly', 'test');
    if ($this->db->connect_error) {
      die('connection failed: ' . $this->db->connect_error);
    }
    $rc = $this->db->query('CREATE TEMPORARY TABLE
      soTest (id int auto_increment, html varchar(16), page varchar(16),primary key(id))'
    );
    if ( !$rc ) {  die('error: '.$this->db->error); }
    $rc = $this->db->query("INSERT INTO soTest (html,page) VALUES ('htmlFoo','foo'),('htmlCities','cities')");
    if ( !$rc ) {  die('error: '.$this->db->error); }
  }
}

Сохранить CWE-209: получение информации через сообщение об ошибке .Печать фактического сообщения об ошибке в моем примере скрипта только для тестирования.И вы можете использовать немного более сложную обработку ошибок, чем просто die().

0 голосов
/ 24 августа 2010

Должно быть echo $result;, а не echo $results;

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