#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:
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
);