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

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

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

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

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

mysqli_stmt_bind_result($stmt, $result);

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

5 ответов

Решение

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

  <?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: %s\n", 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[] = &$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); 
    ?>

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

$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']));

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

$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'];
    ....
    }

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

Оператор 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[] = &${'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(&$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[] = &${'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
);
Другие вопросы по тегам