Mysqli — привязка результатов к массиву

#php #mysql #arrays #mysqli #bind

#php #mysql #массивы #mysqli #привязка

Вопрос:

Недавно я перешел на mysqli из mysql и начал использовать подготовленные операторы. в mysql мы делаем

 $result = mysql_query("SELECT * FROM table WHERE id = ?");
  

Таким образом, мы получаем массив всей таблицы в одной переменной.

Но в mysqli мы делаем

 mysqli_stmt_bind_result($stmt, $result);
  

таким образом, в основном здесь только одна переменная получает привязку к переменному результату.
Как мы можем получить ту же переменную (массив), которую мы получили из mysql?
PS — Надеюсь, мой вопрос достаточно ясен. Я знаю, что их не так много возможных методов, но я ищу лучший.
PSS — мне больше нравится процедурный способ.

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

1. PSS - I am more comfortable with the procedural way. тогда вы не являетесь доказательством будущего.

2. Я согласен. Но Mysql — это весь процедурный способ, и я делаю это уже давно. Поэтому мне потребуется время, чтобы переключиться на ооп.

3. Попробуйте ORM, например doctrine-project.org , возможно!?

Ответ №1:

Наконец-то этот код работает !!!!!

   <?php 
    $host = 'localhost'; 
    $user = 'root'; 
    $pass = '1234'; 
    $data = 'test'; 

    $mysqli = new mysqli($host, $user, $pass, $data); 
    /* check connection */ 
    if (mysqli_connect_errno()) { 
        printf("Connect failed: %sn", mysqli_connect_error()); 
        exit(); 
    } 

    if ($stmt = $mysqli->prepare("SELECT * FROM sample WHERE t2 LIKE ?")) { 
        $tt2 = '%'; 

        $stmt->bind_param("s", $tt2); 
        $stmt->execute(); 

        $meta = $stmt->result_metadata(); 
        while ($field = $meta->fetch_field()) 
        { 
            $params[] = amp;$row[$field->name]; 
        } 

        call_user_func_array(array($stmt, 'bind_result'), $params); 

        while ($stmt->fetch()) { 
            foreach($row as $key => $val) 
            { 
                $c[$key] = $val; 
            } 
            $result[] = $c; 
        } 

        $stmt->close(); 
    } 
    $mysqli->close(); 
    print_r($result); 
    ?>
  

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

1. У меня был готовый дистрибутив PHP, который не включал mysqlnd. Этот код заменил вызов mysqli_stmt_get_result() и mysqli_fetch_all().

Ответ №2:

Используйте подготовленный оператор как..

 $stmt = $mysqli->prepare("SELECT id, label FROM test WHERE id = 1");
$stmt->execute();
$res = $stmt->get_result();
$row = $res->fetch_assoc();

printf("id = %s (%s)n", $row['id'], gettype($row['id']));
printf("label = %s (%s)n", $row['label'], gettype($row['label']));
  

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

1. я хочу использовать select *

2. @jackkorbin помогает ли мой ответ??

Ответ №3:

Используйте просто так

 $con=mysqli_connect( "$host", "$mysql_u", "$mysql_p","$mysql_db");/*these variables are ur host,username, password and db name*/
    $val="SELECT * FROM table";
    $ex=mysqli_query($con,$val);
    while ($row = mysqli_fetch_assoc($ex)) {

    $ans=$row['col1'];
    ....
    }
  

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

1. ВЫБОР * ИЗ таблицы был просто для примера.. я должен использовать подготовленный оператор, потому что он фактически ВЫБИРАЕТ * ИЗ таблицы, ГДЕ id = ? .

2. @jackkorbin Просто добавьте условие where, например, $val=»ВЫБРАТЬ * ИЗ таблицы, ГДЕ col1=’aaa'»;

3. извините, я отвечу вам снова

4. ссылка эта ссылка может помочь вам

5. Не имеет значения, вы можете использовать подготовленный оператор — но для извлечения в массив вы все равно используете (предполагая, что вы кодируете процедурный) mysqli_fetch_assoc оператор.

Ответ №4:

mysql:

 $result = mysql_query("SELECT * FROM table");
  

mysqli:

 $result = mysqli_query("SELECT * FROM table");
  

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

Но если вы когда-нибудь захотите использовать mysqli_stmt_bind_result и возвращать массив вместо одного столбца одновременно, вам может потребоваться обернуть его своей собственной пользовательской функцией.

Хорошая новость: в нижней части документации есть несколько примеров, но они находятся в ООП (время переключаться?).


 $result = mysql_query("SELECT * FROM table WHERE id = ?");


/* create a prepared statement */
if ($stmt = mysqli_prepare($link, "SELECT col1, col2  FROM table WHERE id = ?")) {

    /* bind parameters for markers */
    mysqli_stmt_bind_param($stmt, "s", $city);

    /* execute query */
    mysqli_stmt_execute($stmt);


    /* fetch associative array */
    while ($row = mysqli_fetch_assoc($stmt)) {
        printf ("%s (%s)n", $row["col1"], $row["col2"]);
    }


}else{
    echo "prepared failed";
}
  

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

1. @jackkorbin Я расширил свой ответ и включил пример для подготовленного оператора

2. @jackkorbin в итоге вы использовали пример по ссылке, которую я предоставил, вы не могли бы одобрить мой ответ?

Ответ №5:

Оператор списка переменных аргументов PHP (многоточие) удобен для динамического количества подготовленных замен операторов:

 mysqli_stmt_bind_param($stmt, $params_types, ...$params);
  

Пример:

 $sql = 'SELECT * FROM Table WHERE one = ? AND two = ?';
$params_types = 'ii';
$params = array(1, 2);

// prepare
$stmt = mysqli_stmt_init($dbconn_read);
if ( mysqli_stmt_prepare($stmt, $sql) ) {

  // bind and execute
  mysqli_stmt_bind_param($stmt, $params_types, ...$params); // unpack array into arguments
  mysqli_stmt_execute($stmt);

  // get column names for binding return results
  $resultmeta = mysqli_stmt_result_metadata($stmt);
  list($columns, $columns_vars) = array(array(), array());
  while ( $field = mysqli_fetch_field($resultmeta) ) {
    $columns[] = $field->name;
    $columns_vars[] = amp;${'column_' . $field->name};
  }

  // call bind function with arguments in array
  call_user_func_array('mysqli_stmt_bind_result', array_merge(array($stmt), $columns_vars));

  // get return results
  $return_array = array();
  while ( mysqli_stmt_fetch($stmt) ) {
    $row = array();
    foreach ( $columns as $col ) {
      $row[$col] = ${'column_' . $col}; // populate assoc. array with data
    }
    $return_array[] = $row; // push row data onto return array
  }
}
  

Еще лучше включить в функцию:

 function db_query(amp;$dbconn, $sql, $params_types, ...$params) { // pack dynamic number of remaining arguments into array

  // GET QUERY TYPE
  $query_type = strtoupper(substr(trim($sql), 0, 4));

  $stmt = mysqli_stmt_init($dbconn);
  if ( mysqli_stmt_prepare($stmt, $sql) ) {
    mysqli_stmt_bind_param($stmt, $params_types, ...$params); // unpack
    mysqli_stmt_execute($stmt);

    if ( 'SELE' == $query_type || '(SEL' == $query_type ) {
      $result = mysqli_stmt_result_metadata($stmt);
      list($columns, $columns_vars) = array(array(), array());
      while ( $field = mysqli_fetch_field($result) ) {
        $columns[] = $field->name;
        $columns_vars[] = amp;${'column_' . $field->name};
      }
      call_user_func_array('mysqli_stmt_bind_result', array_merge(array($stmt), $columns_vars));
      $return_array = array();
      while ( mysqli_stmt_fetch($stmt) ) {
        $row = array();
        foreach ( $columns as $col ) {
          $row[$col] = ${'column_' . $col};
        }
        $return_array[] = $row;
      }

      return $return_array;
    } // end query_type SELECT

    else if ( 'INSE' == $query_type ) {
      return mysqli_insert_id($dbconn);
    }
    return 1;
  }
}
  

Назовите это так:

 $records = db_query(
  $dbconn_read,
  'SELECT * FROM Table WHERE one = ? AND two = ?',
  'ii', 1, 2
);