EDIT 07/2015 (質問は元の回答から編集されていますが、基本的な原則は同じです)
実稼働環境では決して SELECT *
、奇妙な、予測不可能な、一見無関係な方法であなたを噛むために戻ってくるだけです. 必要な列を指定することにより、列の順序、データ型、制約、およびその他のあらゆる種類の要素が長期的に問題を引き起こさないようにすることができます。
この答えはまだほとんど有効なので、そのままここに残しますが、主なポイントは次のとおりです。PDO を使用します。同じバックエンド。より複雑な RDBMS 固有の API が必要な場合は、抱えている問題と、代わりに mysqli などが必要な理由をすでに理解しています。
SELECT *
MySQLi の準備済みステートメントではうまく機能しません。これが、代わりにPDOをお勧めする主な理由の 1 つです。それと、値の代わりに変数参照をパラメーターにバインドするというばかげた要件です。
$stmt->bind_result($row);
これは結果行を変数にバインドするのではなく、単一の列をバインドするだけです。そして、あなたが使ったのでSELECT *
、それはあなたが望むことをしません。
PDO で MySQLi を使用したい場合 (私が言うように、これをお勧めします) 、マニュアル ページのこのSELECT *
ようなコメントに、方法の良い例がいくつかあります。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();
新しいコードに基づいて編集します。これを行う必要があります。
// $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
}