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