Ниже приведен плохо написанный и сильно неправильно понятый код PHP без проверки ошибок. Честно говоря, я немного борюсь за лабиринт PHP-> MySQLi! Может ли кто-нибудь указать пример того, как использовать подготовленные операторы для сбора результатов в ассоциативном массиве, а также получать количество строк из $ stmt? Ниже приведен код, с которым я играю. Я думаю, что бит, который меня отбрасывает, использует значения $stmt
после store_result
а затем пытается собрать массив-член, и я не слишком уверен, почему …
$mysqli = mysqli_connect($config['host'], $config['user'], $config['pass'], $config['db']); $stmt = $mysqli->prepare("SELECT * FROM licences WHERE generated = ?"); $stmt->bind_param('i', $core['id']); $result = $stmt->execute(); $stmt->store_result(); if ($stmt->num_rows >= "1") { while($data = $result->fetch_assoc()){ //Loop through results here $data[] } }else{ echo "0 records found"; }
Я чувствую себя немного нахально, просто прося код, но его рабочая демонстрация моих обстоятельств, которые, как мне кажется, мне нужно наконец понять, что происходит на самом деле. Бесконечно благодарен!
Правда, функции DatabaseFunctions немного странные. Вы доберетесь туда.
Код выглядит немного, но, как это работает:
Соединение построено, подготовлен оператор, привязан параметр и он выполнен, все хорошо.
$result = $stmt->execute(); //execute() tries to fetch a result set. Returns true on succes, false on failure. $stmt->store_result(); //store_result() "binds" the last given answer to the statement-object for... reasons. Now we can use it! if ($stmt->num_rows >= "1") { //Uses the stored result and counts the rows. while($data = $result->fetch_assoc()){ //And here, the answer-object is turned into an array-(object) // which can be worked with nicely. //It loops trough all entries in the array. } }else{ echo "0 records found"; }
Я долго искал, но не нашел документацию, необходимую для правильного ответа, но я сделал свое исследование.
$stmt->get_result()
заменит $stmt->store_result()
для этой цели. Итак, если мы увидим
$stmt_result = $stmt->get_result(); var_dump($stmt_result);
мы получаем
object(mysqli_result)[3] public 'current_field' => int 0 public 'field_count' => int 10 public 'lengths' => null public 'num_rows' => int 8 #That we need! public 'type' => int 0
Поэтому я предлагаю следующее общее решение. (Я включаю отчет об ошибке, который я использую)
#Prepare stmt or reports errors ($stmt = $mysqli->prepare($query)) or trigger_error($mysqli->error, E_USER_ERROR); #Execute stmt or reports errors $stmt->execute() or trigger_error($stmt->error, E_USER_ERROR); #Save data or reports errors ($stmt_result = $stmt->get_result()) or trigger_error($stmt->error, E_USER_ERROR); #Check if are rows in query if ($stmt_result->num_rows>0) { # Save in $row_data[] all columns of query while($row_data = $stmt_result->fetch_assoc()) { # Action to do echo $row_data['my_db_column_name_or_ALIAS']; } } else { # No data actions echo 'No data here :('; } $stmt->close();
Ваша проблема заключается в том, что для создания fetch->assoc()
вам нужно сначала получить набор результатов из подготовленного оператора, используя:
http://php.net/manual/en/mysqli-stmt.get-result.php
И угадайте, что: эта функция работает, только если вы используете собственный драйвер MySQL или «mysqlnd». Если вы не используете его, вы получите сообщение «Фатальная ошибка».
$result = $stmt->execute(); /* function returns a bool value */
ссылка: http://php.net/manual/en/mysqli-stmt.execute.php
поэтому его достаточно написать $stmt->execute();
для выполнения запроса.
Основная идея состоит в следующем:
1. Сделайте соединение. (теперь, используя метод sqli или PDO, вы устанавливаете соединение и подключаетесь к базе данных за один шаг)
2. Подготовьте шаблон запроса
3. Свяжите параметры с переменной
4. (установите значения для переменной, если она не установлена, или если вы хотите изменить значения), а затем выполните свой запрос.
5. Теперь заберите свои данные и выполните свою работу.
6. Закройте соединение.
/*STEP 1*/ $mysqli = mysqli_connect($servername,$usrname,$pswd,$dbname); /*STEP 2*/ $stmt = $mysqli->prepare("SELECT * FROM licences WHERE generated = ?"); /*Prepares the SQL query, and returns a statement handle to be used for further operations on the statement.*/ //mysqli_prepare() returns a statement object(of class mysqli_stmt) or FALSE if an error occurred. /* STEP 3*/ $stmt->bind_param('i', $core['id']);//Binds variables to a prepared statement as parameters /* STEP 4*/ $result = $stmt->execute();//Executes a prepared Query /* IF you wish to count the no. of rows only then you will require the following 2 lines */ $stmt->store_result();//Transfers a result set from a prepared statement $count=$stmt->num_rows; /*STEP 5*/ //The best way is to bind result, its easy and sleek while($data = $stmt->fetch()) //use fetch() fetch_assoc() is not a member of mysqli_stmt class { //DO what you wish //$data is an array, one can access the contents like $data['attributeName'] }
Нужно вызвать mysqli_stmt_store_result () для (SELECT, SHOW, DESCRIBE, EXPLAIN), если вы хотите буферировать полный набор результатов клиентом, чтобы последующий вызов mysqli_stmt_fetch () возвращал буферизованные данные.
Нет необходимости вызывать mysqli_stmt_store_result () для других запросов, но если вы это сделаете, это не повредит или не приведет к какой-либо заметной производительности во всех случаях.
–reference: php.net/manual/en/mysqli-stmt.store-result.php
и http://www.w3schools.com/php/php_mysql_prepared_statements.asp
Нужно посмотреть вышеприведенную ссылку, которая сталкивается с проблемой в этом вопросе, мой ответ может быть не идеальным, люди могут улучшить мой ответ …
Вы можете попробовать это, используя функцию mysqli_stmt get_result (), которую вы можете использовать для извлечения связанного массива. Примечание get_result возвращает объект типа mysqli_result.
$stmt->execute(); $result = $stmt->get_result(); //$result is of type mysqli_result $num_rows = $result->num_rows; //count number of rows in the result // the '=' in the if statement is intentional, it will return true on success or false if it fails. if ($result_array = $result->fetch_assoc(MYSQLI_ASSOC)) { //loop through the result_array fetching rows. // $ rows is an array populated with all the rows with an associative array with column names as the key for($j=0;$j<$num_rows;$j++) $rows[$j]=$result->fetch_row(); var_dump($rows); } else{ echo 'Failed to retrieve rows'; }