データベースに接続して$dbから操作したい  【解決済み】

困った時はこちらで質問してください。回答を担当する人は特に決まっていませんので、分かる方は回答をお願いします。
アバター
moitaro
記事: 85
登録日時: 2015/10/27 11:10

データベースに接続して$dbから操作したい

投稿記事by moitaro » 2016/1/19 17:21

度々お世話になっております。
現在ZenCart1.3をZenCart1.5へ移植しております。

ZenCart1.3のテンプレートの製作者は退職しているのでソースを見ながらゴリゴリ移植しているのですが
前担当者が独自に作成したコンテンツがあり
そのコンテンツはデータベースに接続して値を取っているのですが
それが正常に働かなくて困っております。

1.3のソースを見てみると
$list_query = "SELECT * \n";
$list_query .= "FROM " . TABLE_HOGEHOGE_INFOMATION . " \n";
$db->Execute($list_query);
とやっております。

1.5へ移植しようとそのまま持ってくると$dbを呼び出した時点で落ちてしまうのです。

ソースを追って$dbは
admin\admin_activity.php
で宣言されているのは分かったので
require('admin_activity.php');
とやると初期設定のような画面が出てしまします……


明示的に新規に$dbに接続しようかとも思いましたが
IDとPWを表記するのはセキュリティ的に良くないと思っております。

データベースに接続して$dbを使用したいのですが
最低限何をrequire すれば$dbが使用出来るのでしょうか?

上記お問い合わせ致します。
ご助力いただけますと嬉しく思います。
アバター
kimono
記事: 1995
登録日時: 2005/9/27 13:30
お住まい: 大阪府大阪市天王寺区上本町
連絡を取る:

Re: データベースに接続して$dbから操作したい

投稿記事by kimono » 2016/1/19 18:14

こんにちわ。kimonoです :)

$dbってどこかから呼び込んでいるのではなく、そのままそこに記載しているものが、$dbですね。

$list_query = "SELECT * \n";
$list_query .= "FROM " . TABLE_HOGEHOGE_INFOMATION . " \n";
$db->Execute($list_query);


これがそのまま$dbです。
なので、何かをrequireしても仕方ないですね。
単純に、$db->Execute($list_query);これは、$list_queryでのデーターベースの結果です。
$list_queryは、mysqlの接続文ですね。
ちなみに、データーベースには既に接続されていますので、idやパスワードなどは必要ありません。

恐らくですが、TABLE_HOGEHOGE_INFOMATIONの設定がされていないので、TABLE_HOGEHOGE_INFOMATIONが何か分からないので、接続ができないのではないでしょうか?

$list_query .= "FROM (テーブル名) \n";

と直接指定したら、読み込めるのではないでしょうか?
アバター
moitaro
記事: 85
登録日時: 2015/10/27 11:10

Re: データベースに接続して$dbから操作したい

投稿記事by moitaro » 2016/1/21 11:32

コメントありがとうございます。

接続しているのかと思っているのですが
$list_query .= "FROM `infomation`\n";
$list_tmp = $db->Execute($list_query);
の時点で
Fatal error: Call to a member function Execute() on a non-object in /home/hogehoge/info_new.php on line 20
と表示されるので宣言されていない気がして困っているのです……

ご助力頂けますと嬉しく思います。
アバター
moitaro
記事: 85
登録日時: 2015/10/27 11:10

Re: データベースに接続して$dbから操作したい

投稿記事by moitaro » 2016/1/21 11:54

require('includes/application_top.php');
があやしいそうでしたが
エラーメッセージが変わって
WARNING: An Error occurred, please refresh the page and try again.
と出ます……うーん((+_+))
アバター
moitaro
記事: 85
登録日時: 2015/10/27 11:10

Re: データベースに接続して$dbから操作したい

投稿記事by moitaro » 2016/1/21 17:38

度々 思考のメモを表記して失礼しました。

$list_query = "SELECT * \n";   //←が無いだけでした。
$list_query .= "FROM infomation\n";

頑張りますっ
アバター
yama
記事: 296
登録日時: 2005/9/18 01:32
お住まい: 福岡県福岡市早良区
連絡を取る:

Re: データベースに接続して$dbから操作したい

投稿記事by yama » 2016/1/21 18:57

global $db;
とかを書かないといけないのかも?(たぶん違うと思いますが)

コード: 全て選択

$list_tmp = $db->Execute('SELECT * FROM information');
余談ですが、こう書くだけでよいですね。コードを整理しながら進めると原因を見つけやすくなると思います。
アバター
moitaro
記事: 85
登録日時: 2015/10/27 11:10

Re: データベースに接続して$dbから操作したい

投稿記事by moitaro » 2016/1/22 10:19

yama様
助言ありがとうございます。

>コードを整理しながら進めると原因を見つけやすくなると思います。
仰る通りですねっ

頑張ります。


ただ今管理画面からなら
require('includes/application_top.php');
で$dbが使えるがTOPページにDBから引っ張ってきたデータを使う方法調べ中……
require('admin/includes/application_top.php');
じゃだめなのカナ……

実行したファイルで呼び出しているけど
require('hogeadmin/includes/application_top.php');
でも駄目っぽい……

んんん???
table_exists_zen
ですら落ちるぞ……
なんか基本的なものをrequireしていない予感っ

なんかapplication_top.php'を読み込んでもdbに接続出来ない場合があるので
     ↑だけではない予感……

何を読み込めば良いのか追うか……  本当に思考メモ失礼します。

require('includes/classes/class.phpbb.php');
でもないし…… 追い方が分からないので結局手当り次第になりそうです……orz
アバター
kimono
記事: 1995
登録日時: 2005/9/27 13:30
お住まい: 大阪府大阪市天王寺区上本町
連絡を取る:

Re: データベースに接続して$dbから操作したい

投稿記事by kimono » 2016/1/22 18:00

ちょっとやりたいことが具体的に分からないので、こちらもアドバイスなどもこれ以上分からないですね。
普通にZen Cartのファイルの中であれば、おっしゃる通り
require('includes/application_top.php');
だけを呼べば問題ありません。

何か別のファイルで何か別のことをしようとしているとかでしょうか?
もし、そうだとすると、1.5系の場合、定義されていないファイルでは、セキュリティの観点上簡単にはできないようにしているはずですね。
モジュールのように管理画面の中に読み込んでいるものなら大丈夫のはずですが。

後は、具体的にどういったファイルで、何をしたいかということになるかと思いますね。
アバター
moitaro
記事: 85
登録日時: 2015/10/27 11:10

Re: データベースに接続して$dbから操作したい

投稿記事by moitaro » 2016/1/23 19:31

ご返答ありがとうございます。

>普通にZen Cartのファイルの中であれば、おっしゃる通り
>require('includes/application_top.php');
>だけを呼べば問題ありません。

informationというテーブルをdbに作成していまして
管理画面でinformationテーブルを弄る操作をして
購入画面でinformationテーブルの情報を表示しようとしております。

ですが管理画面からだとinformationテーブルが弄れるのに
購入画面でinformationテーブルの表示が出来ないので困っている状態なのです……

tpl_defaulthogehoge.phpに
require('includes/application_top.php');
とやって$db見れるものなのでしょうか?

何か必要な情報が足りてない予感がしますが上記お問い合わせ致します。
アバター
moitaro
記事: 85
登録日時: 2015/10/27 11:10

Re: データベースに接続して$dbから操作したい

投稿記事by moitaro » 2016/1/25 12:14

落ち着いて書きます。

include/templates/hogehoge/templates/tpl_index_default.php
から呼び出している
includes/templates/hogehoge/templates/tpl_modules_hoge_infomation.php
からデータベースにアクセスしたいと思っておりますが出来ません。
そこで呼び出している
require('includes/application_top.php');
で落ちてしまいます。


管理画面フォルダにある
hogehogeadmin/hoge_info_new.php
からは
require('includes/application_top.php');
でデータベースにアクセス出来ました。

ですので
includes/templates/hogehoge/templates/tpl_modules_hoge_infomation.php

require('../../../../hogehogeadmin/includes/application_top.php');
とやっても↑で落ちるし
require('hogehogeadmin/includes/application_top.php');
とやっても落ちます……

どうやってdbを使用出来るように
requireを表記するのが良いのでしょうか?

以上 お問い合わせ致します。
アバター
kimono
記事: 1995
登録日時: 2005/9/27 13:30
お住まい: 大阪府大阪市天王寺区上本町
連絡を取る:

Re: データベースに接続して$dbから操作したい

投稿記事by kimono » 2016/1/28 11:45

まず、管理画面と、表側は全く違います。
また、modulesとtemplateも全然違います。
なので、今後はもう少し今回のように具体的に教えていただくのがいいかと思いますね。

さて、今回の例でいいますと、テンプレートからテンプレートを呼び出しているということですが、通常はテンプレート内でデーターベースと接続は行いません。
通常であれば、modulesのファイルでデーターベースと接続します。
そして、そちらで変数にして、テンプレートで呼び出すというのが通常のZen Cartの流れとなります。

そのため、下記の例でありましたら、
includes/templates/hogehoge/templates/tpl_modules_hoge_infomation.php
であれば、通常は頭の部分で、
require(DIR_WS_MODULES . zen_get_module_directory('hoge_infomation.php'));
としているのではないかと思います。

そして、modulesディレクトリのhoge_infomation.phpでは、何もrequireしなくても普通にデーターベースへと接続できます。

例としまして、
includes/templates/template_default/templates/tpl_modules_checkout_address_book.php
こちらをご確認いただきますと、
require(DIR_WS_MODULES . zen_get_module_directory('checkout_address_book.php'));
となっています。そのため、
includes/modules/checkout_new_address.php
を確認しますと、
if (FURIKANA_NESESSARY) {
$addresses_query = "select address_book_id, entry_firstname as firstname, entry_lastname as lastname,
entry_firstname_kana as firstname_kana, entry_lastname_kana as lastname_kana,
entry_company as company, entry_street_address as street_address,
entry_suburb as suburb, entry_city as city, entry_postcode as postcode,
entry_state as state, entry_zone_id as zone_id,
entry_country_id as country_id,
entry_telephone as telephone,entry_fax as fax
from " . TABLE_ADDRESS_BOOK . "
where customers_id = '" . (int)$_SESSION['customer_id'] . "'";
}else {
$addresses_query = "select address_book_id, entry_firstname as firstname, entry_lastname as lastname,
entry_company as company, entry_street_address as street_address,
entry_suburb as suburb, entry_city as city, entry_postcode as postcode,
entry_state as state, entry_zone_id as zone_id,
entry_country_id as country_id,
entry_telephone as telephone,entry_fax as fax
from " . TABLE_ADDRESS_BOOK . "
where customers_id = '" . (int)$_SESSION['customer_id'] . "'";
}
// <-furikana

$addresses = $db->Execute($addresses_query);

こんな感じでデーターベースに接続しています。
後は、テンプレート側で、$addresses->fields['address_book_id']などとして呼び出せばいいだけですね。
アバター
moitaro
記事: 85
登録日時: 2015/10/27 11:10

データベースに接続して$dbから操作したい

投稿記事by moitaro » 2016/2/08 18:05

kimono様
度々のご支援ありがとうございます。

一般的にはテンプレートからモジュールにを呼び出して
dbにアクセスするのですねっ

ですが【前任者】が
テンプレートやadminフォルダからdbに接続して実装しているので
なんとか移植しようと頑張ってます……

adminフォルダからdbに接続している際に
db名が上手く引けていない場合があるのを発見しました……

ですのでファイル上部に
--------
define('TABLE_PRODUCTS_SET', 'products_set');


--------
など強引に入れていたのですが
不恰好なためどうにかしたいと思っております。

1.3の方では
db名は
include/extra_datafile/custom_databese_tables.php
にありましたので
1.5の方も同様なフォルダの場所にファイルを置いたのですが読んでくれません。

1.3と1.5では
関数の始めに呼ぶ部分が違うのでしょうか?
上記db名を引きたいと思っております……


時間が出来ましたら
モジュールから接続する方法で実装してみたいと思いますっ

ご助力頂けますようよろしくお願い申し上げます。
アバター
kimono
記事: 1995
登録日時: 2005/9/27 13:30
お住まい: 大阪府大阪市天王寺区上本町
連絡を取る:

データベースに接続して$dbから操作したい  【解決済み】

投稿記事by kimono » 2016/2/08 18:13

後は具体的にもっと詳細を教えてもらえないと駄目ですね。
やはり呼べない場所で呼ぼうとしているように思われますが、どこのどのファイルから、もしくは追加したファイル(どのようにどんな形で設置したもの)から、どのようにしているかが中のソースとかも引用しながら教えてもらわないと分からないですね。
Zen Cartの質問というよりも、PHPやmysqlのプログラムの仕方の質問のようにも思われます。
phpとmysql両方の知識は今回の例の場合は必須でしょうから、他のカスタマイズなどを真似て頑張るか、どこまで手間暇をかけるか、もしくは誰かに依頼するかなどになるのではないでしょうかね?

“Zen Cart 質問コーナー” へ戻る