OpenCart1.5.2.1の既存の動作中のインストールを「継承」しました。
テスト目的のために、ローカルサーバーに開発サイトをセットアップしたいと思いました。そこで、ローカルにインストールしてDBをコピーしました。
問題なくバックエンドにログインできます。ストアが設定され、すべての製品とカテゴリもそこにあります。
フロントエンドでは、ストアのホームページにアクセスでき、カテゴリごとの製品数を含むカテゴリのリストが正しく表示されます。
ただし、カテゴリリスト、またはそのことに関する個々の製品を表示しようとすると、空白のページが表示されます。
PHPエラーが発生しません-追加しました
display_errors = 1;
error_reporting = E_ALL;
log_errors = 1;
カートのルートフォルダにあるphp.iniに移動します。
OpenCartエラーログ内から、次のエラーメッセージが表示されます。
2013-03-13 18:51:15 - PHP Notice: Error: Column 'product_id' cannot be null<br />Error No: 1048<br />SELECT DISTINCT *, p [...] AND p2s.store_id = '5' in /path/to/root/system/database/mysql.php on line 49
この問題を解決する方法はありますか?
** アップデート: **
完全なクエリは次のとおりです。
SELECT DISTINCT *, pd.name, pd.creator, pd.keyword, pd.circa, pd.year, pd.century, pd.decade, pd.scenelocation, pd.fm_quicksearch AS fm_quicksearch, p.image, m.name AS manufacturer, (SELECT price FROM product_discount pd2 WHERE pd2.product_id = p.product_id AND pd2.customer_group_id = '8' AND pd2.quantity = '1' AND ((pd2.date_start = '0000-00-00' OR pd2.date_start < NOW()) AND (pd2.date_end = '0000-00-00' OR pd2.date_end > NOW())) ORDER BY pd2.priority ASC, pd2.price ASC LIMIT 1) AS discount, (SELECT price FROM product_special ps WHERE ps.product_id = p.product_id AND ps.customer_group_id = '8' AND ((ps.date_start = '0000-00-00' OR ps.date_start < NOW()) AND (ps.date_end = '0000-00-00' OR ps.date_end > NOW())) ORDER BY ps.priority ASC, ps.price ASC LIMIT 1) AS special, (SELECT points FROM product_reward pr WHERE pr.product_id = p.product_id AND customer_group_id = '8') AS reward, (SELECT ss.name FROM stock_status ss WHERE ss.stock_status_id = p.stock_status_id AND ss.language_id = '1') AS stock_status, (SELECT wcd.unit FROM weight_class_description wcd WHERE p.weight_class_id = wcd.weight_class_id AND wcd.language_id = '1') AS weight_class, (SELECT lcd.unit FROM length_class_description lcd WHERE p.length_class_id = lcd.length_class_id AND lcd.language_id = '1') AS length_class, (select (r.sum + p.rat)/(r.tot + p.tot) from (select COALESCE(j.sum,0) as sum , COALESCE(j.tot,0) as tot from (select SUM(rating) as sum , COUNT(rating) as tot, product_id from rating where product_id = '9206' group by product_id) j right join product on product.product_id = j.product_id where product.product_id = '9206') r, (select product_id, COALESCE(rating,0) as rat, count(rating) as tot from product where product_id = '9206' and rating > 0) p ) AS rating, p.sort_order FROM product p LEFT JOIN product_description pd ON (p.product_id = pd.product_id) LEFT JOIN product_to_store p2s ON (p.product_id = p2s.product_id) LEFT JOIN manufacturer m ON (p.manufacturer_id = m.manufacturer_id) WHERE p.product_id = '9206' AND pd.language_id = '1' AND p.status = '1' AND p.date_available <= NOW() AND p2s.store_id = '5'
アップデート
MySQLまたはPHPの構成と関係があるのではないかと思います。ライブサイトで同じクエリを実行すると、必ず機能するためです。
アップデート
この問題は、MySQLのローカルインストールに関連しています。オンラインDBを使用する場合は、すべて問題ありません。OpenCartフォーラムの誰か-投稿へのリンクは次のことを示しました:
このエラーは、特にmySQL 5.1以降で、作成者が自動インクリメントフィールドが拒否するnullステートメントを追加しようとした特定の貢献に対する挿入クエリに起因します。mySQL開発者によるこの方法論は、何年も前にブロックされています。
実行されたクエリとともに自動的にインクリメントされた値をすでに作成しているため、自動インクリメントフィールドはクエリでアドレス指定する必要がないことを述べて、この問題に対処するために作成者に連絡してください。
それはこれらの線に沿っているかもしれません。クエリ自体は挿入ではありませんが、それと関係がある可能性が最も高いです。私はその問題をさらに調べます。