以下の本でのsession70以降に掲載されている会員認証システムで、DBエラーが出てしまいます。

http://book.mycom.co.jp/support/bookmook/PHP/


まず、会員新規登録画面で県テーブルから値を取得してきません。
当然、DBには県データを作成してあります。
http://www.boardholic.net/member/index.php?type=regist&action=form

他の項目を埋めて会員登録を行うとunknown errorが出ます。
$result->getDebugInfo()でechoを掛けますと、[nativecode=1065 ** Query was empty] と出ます。

次に、PHPMyAdminで会員マスターに直接データを挿入し、会員削除を行いますと、syntax error が出ます。
$result->getDebugInfo()のechoでは、
DELETE FROM m_member WHERE id = [nativecode=1064 ** You have an error in your SQL syntax. Check the manual that corresponds to your MySQL server version for the right syntax to use near '' at line 3]

一応、必死にソースを追って、変数、引数、定数などechoで調べました。
そもそも、稼動したサンプルを掲載しているはずですから・・・
この本の著者はモジュール版のローカルで試しているはずですが、レンタルサーバーがCGI版PHPということなど関係あるのでしょうか?

レンタルサーバー ヘテムル
http://heteml.jp/service/function/

どなたか、エラー原因をご推察いただけないでしょうか?

回答の条件
  • 1人2回まで
  • 登録:
  • 終了:2007/02/26 23:35:43
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

ベストアンサー

id:know94space No.1

回答回数16ベストアンサー獲得回数3

ポイント100pt

問題が3つあるということですね。

1)入力画面で県が表示されない

2)入力フォームで、unknown errorが表示される[Query was Empty]

3)会員削除で、文法エラーが出る。

1)については、

確認方法としては、

PHPmyAdminで、県を取り出すところで実行されているSQL文を実行してみて県のリストが取り出せるか?

を確認する。

SELECT * FROM m_ken;

取り出せた後、正確にHTMLに出力できているか?

がチェックポイントになりそうです。

MYDB.inc.phpというファイル

db_get_ken_dataの関数が正確かどうかをチェックする。

2)実行しているSQL文を表示させてみてください。

多分、SQL文が空なのではないかと思います。だから、Query was Emptyと表示されるのではないかと。

3)DELETE FROM m_member WHERE id =

で終わっているので、idの値が指定されていないためにSQL文が成立していない。

文法エラーとして表示されているのではないかと思います。

MYDB.inc.phpというファイル

db_delete_member_idという関数に間違いがあるか、idがうまく渡されていないのかもしれません。

おそらく、どの動作もレンタルサーバーで違いが出そうな処理は思いつきませんでした。

id:seadwell

know94space さま

御回答ありがとうございます。ほんっと助かりました。

おかげで無事正常動作を確認いたしましたm(_ _)m

結論から書きますと、sub.inc.php の function sjis2euc_for_Winodows($data)およびfunction euc2sjis_for_Winodows($data)が邪魔をしておりました。

know94space 様のおっしゃるとおり、CGI版PHP関係なくソースに問題があるとのご指摘で、MYDB.inc.php中心に調べていきました。

(1)ですが、MYDB.inc.phpのSQL(function execute_sql($conn,$sql))では無事取得されているのに、function db_get_ken_data($conn)では値が空になっているところまでつきとめ、多次元配列をしているfunction select_arrays($conn, $sql)に原因があると睨み、片っ端から、echoを掛けたところ、$value = sjis2euc_for_Winodows($value);のところを吊り上げました。

sjis2euc_for_Winodows部分は文字コード変換の定型サブルーチンでしたので、気にも留めていませんでしたが、コメントアウトしたら正常終了を確認しました。

ここまでくれば、(2)(3)の問題も know94space さまのおっしゃるとおり、

> 多分、SQL文が空なのではないかと思います。だから、Query was Emptyと表示される・・・

> idの値が指定されていないためにSQL文が成立していない・・・

の問題解決も簡単でした。

今回、know94space さまの多方向からの問題切り分けにより、原因を突き止められたことは実に的確なご指摘で、また、デバックのコツまでご教授いただいたことに大変感激しています。

実は、3週間くらいハマっていて精根尽きて質問したところでした。

500文字しか質問できないので、もっと多くの情報を入れたかったのですが、これだけの少ない質問情報から問題解決の糸口を見つけてくださったことに感謝するばかりです。

function sjis2euc_for_Winodows のデバックはまだで、無事正常動作確認の途中経過のご報告です。

なんとお礼を申していいやら・・・。

2007/02/26 23:33:40
  • id:know94space
    know94space 2007/02/27 09:31:22
    sjis2euc_for_Winodows と euc2sjis_for_Winodowsは、サーバーがWindows限定で
    動く関数のようですね。

    関数の中身は、
    引数の$data が空ならば、何もしないで終了。
    Windowsのサーバーの場合は文字コード変換。
    で終わってしまっています。

    サーバーがレンタルサーバーの場合通常は、Windowsサーバーではないので
    ここの部分で値が関数から帰ってこないように思えます。
    (この部分は、Windows環境前提で作成されています。)
    もし修正するなら、if(preg_match...で始まるif文にelseを足して
    なにもしないで$dataを返すようにしたら空にならないかもです。

    スクリプトの作者は、for_Windowsとつけていることからそのあたりも認識
    していたようです。

    詳細や前提は、本の中で触れられている可能性が高いのでなんとも分かりません。

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません