Intereting Posts

Не удалось выполнить запрос SELECT в подготовленном сообщении

Ive последовал кучу разных примеров использования SELECT в подготовленном заявлении, но ничего не возвращается. EDIT Я немного изменил свой код, чтобы выглядеть так:

$date1 = 2012-01-01; $date2 = 2012-01-31; $sql_con = new mysqli('db', 'username', 'password', 'database'); if($stmt = $sql_con->prepare("SELECT eventLogID FROM Country WHERE countryCode=? AND date BETWEEN ? AND ?")){ $stmt->bind_param("sss", $country_code, $date1,$date2); $stmt->execute(); $i=0; while ($stmt->fetch()){ $stmt->bind_result($row[$i]); $i++; } $stmt->close(); $sql_con->close(); 

Теперь все нужные записи, кроме первого, добавляются в строку $ row []. Почему не добавляется первая запись? Заранее спасибо!

EDIT 07/2015 (вопрос был отредактирован с оригинального ответа, но основные принципы совпадают)

Никогда не SELECT * в производственной среде, он вернется, чтобы укусить вас странными, непредсказуемыми и, казалось бы, несвязанными способами. Указав нужные столбцы, вы убедитесь, что упорядочение столбцов, тип данных, ограничение и всевозможные другие элементы не вызовут проблем в долгосрочной перспективе.

Этот ответ по-прежнему в основном действителен, поэтому я оставлю его здесь как есть, но основной взлет: использовать PDO, он делает 98% вещей, которые вам когда-либо понадобятся, с более чистым и более сжатым API поверх такой же задний конец. Если вам нужен более сложный RDBMS-специфический API, тогда вы уже поймете проблемы, которые у вас есть, и почему вам нужен mysqli и т. Д.


SELECT * не очень хорошо работает с подготовленными операциями MySQLi. Это одна из основных причин, по которой я рекомендую PDO – это и смешное требование связывать переменные ссылки вместо значений с параметрами.

 $stmt->bind_result($row); 

Это не связывает результирующую строку с переменной, она просто привязывает один столбец. И поскольку вы использовали SELECT * , он не делает то, что вы хотите.

Если вы хотите использовать MySQLi над PDO (который, как я сказал, я бы рекомендовал), есть несколько хороших примеров того, как SELECT * в комментариях, подобных этому на bind_result() руководства bind_result() .

Или вы можете просто указать столбцы, которые хотите получить:

 $sql_con = new mysqli('db', 'username', 'password', 'database'); if($stmt = $sql_con->prepare("SELECT name, countryCode FROM Country WHERE countryCode = ?")) { $stmt->bind_param("s", $country_code); $stmt->execute(); $stmt->bind_result($name, $countryCode); while ($stmt->fetch()) { // Because $name and $countryCode are passed by reference, their value // changes on every iteration to reflect the current row echo "<pre>"; echo "name: $name\n"; echo "countryCode: $countryCode\n"; echo "</pre>"; } $stmt->close(); 

EDIT на основе вашего нового кода, вы должны это сделать:

 // $date1 will be int(2010), $date2 will be int(1980) because you didn't // quote the strings! //$date1 = 2012-01-01; //$date2 = 2012-01-31; // Connect to DB $sql_con = new mysqli('db', 'username', 'password', 'database'); // Check for connection errors here! // The query we want to execute $sql = " SELECT eventLogID FROM Country WHERE countryCode = ? AND date BETWEEN ? AND ? "; // Attempt to prepare the query if ($stmt = $sql_con->prepare($sql)) { // Pass the parameters $date1 = '2012-01-01'; $date2 = '2012-01-31'; $stmt->bind_param("sss", $country_code, $date1, $date2); // Execute the query $stmt->execute(); if (!$stmt->errno) { // Handle error here } // Pass a variable to hold the result // Remember you are binding a *column*, not a row $stmt->bind_result($eventLogID); // Loop the results and fetch into an array $logIds = array(); while ($stmt->fetch()) { $logIds[] = $eventLogID; } // Tidy up $stmt->close(); $sql_con->close(); // Do something with the results print_r($logIds); } else { // Handle error here } 

Я думаю, вы должны привязываться к столбцам в bind_results (), как

 /* prepare statement */ if ($stmt = $mysqli->prepare("SELECT Code, Name FROM Country ORDER BY Name LIMIT 5")) { $stmt->execute(); /* bind variables to prepared statement */ $stmt->bind_result($col1, $col2); /* fetch values */ while ($stmt->fetch()) { printf("%s %s\n", $col1, $col2); } 

Здесь $ col1 и $ col2 привязываются к столбцам Code and Name таблицы Country

(Вместо * в SELECT используйте имена столбцов)

Дальнейшая ссылка: http://php.net/manual/en/mysqli-stmt.bind-result.php