MYSQL_ASSOC
お仕事でosCommerceのバージョンアップ作業をしてたトコロ、
「旧バージョン上では正常に動いてたスクリプトが新バージョン上ではうまく動いてくれない」
と言う症状にハマりました。 ※osCommerce 日本語版
やりたい事>
PHPスクリプトでMySQLデータベースからデータを取り出し、配列$prod[0]〜[6]に格納したい
1064 - Something is wrong in your syntax : 'and p.products_id=d.products_id and p.products_id=t.products_id and t.categories' 付近 : 1 行目
SELECT p.products_id, d.products_name, p.products_model, t.categories_id, c.categories_name, p.products_status, k.status FROM products p, products_description d, products_to_categories t, categories_description c, categories k WHERE p.products_id=d.products_id and p.products_id=t.products_id and t.categories_id=c.categories_id and t.categories_id=k.categories_id ORDER BY c.categories_name , p.products_model
↑ちなみにエラーの内容。「SQL文がなんかおかしいよ?」みたいな感じです。
新バージョンと旧バージョンはデータベース構造とかちょっと変わってる→多分その部分だけ修正すれば動くだろう、と軽く考えてたんすが、エラーの出るSQL文をどんどん削り込んでいって、最終的に
$products = tep_db_query("SELECT * FROM products");
まで削ってもエラーになるにあたって、さすがのワタシも「これはおかしい。これはクエリーの問題じゃないな」と気付きました(^^;)
で、はっと気付いたのがこのデータベースクエリーから値を貰って配列に格納するtep_db_fetch_array()という関数。
「(システムが予めやってくれるので)データベースへの接続や選択をしなくていいmysql_fetch_array→まったくの等価だと考えてた(実際旧バージョンではそう考えて何の問題も無かった)んですが、(ようやく)ソースを見ると
旧バージョン
function tep_db_fetch_array($db_query) {
$result = mysql_fetch_array($db_query);
return $result;
}
新バージョン
function tep_db_fetch_array($db_query) {
return mysql_fetch_array($db_query, MYSQL_ASSOC);
}
と、新バージョンではMYSQL_ASSOCオプションが付加されており、
MYSQL_ASSOCを使用すると、( mysql_fetch_assoc()の動作と同様に)連想添字のみ が取得され、MYSQL_NUMを使用すると、 (mysql_fetch_row()の動作と同様に数値添字のみが 取得されます。
つまり、MYSQL_ASSOCが付いてる(デフォルトはMYSQL_BOTH→両方に値が入る)と、数値添字は使えないんですな(^_^;)
連想添字は字数が多くなるんであんまり好きではなかったんですが、こっちのほうがバグを作り込みにくいのは間違い無い→明示的にMYSQL_ASSOCを指定してるのは「数値添字なんてダサいモノは使っちゃ駄目よ!」というメッセージだと思えたんで、素直に
$prod[4] → $prod['categories_name']
みたく書き直したらちゃんと動くようになりました。