PHP5.1.6、MySQL4.0.2x でのDBシンタックスエラーが全然取れません。

エラー箇所は(A)と(B)の二箇所で、Undefined indexです。
なんか間違ってますか?

ハマってます。
どなたか助けてくださいm(_ _)m


function db_modify_wordmaster($conn, $worddata){

$worddata['word_name'] = addslashes($worddata['word_name']); //(A)
$worddata['word_count'] = addslashes($worddata['word_count']); //(B)

$sql = <<<EOS
UPDATE word_master
SET
word_count = {$worddata['word_count']},
word_reload = now()
WHERE
word_name = '{$worddata['word_name']}'
EOS;
//$sql = euc2sjis_for_Winodows($sql);
$result = execute_sql($conn, $sql);
}

回答の条件
  • 1人2回まで
  • 登録:2007/10/23 08:26:31
  • 終了:2007/10/23 20:56:32

ベストアンサー

id:zebevogue No.2

zebevogue回答回数65ベストアンサー獲得回数72007/10/23 09:45:56

ポイント50pt

引数に指定している$worddataにインデックスが無いらしいので、

関数に入った直後の値をvar_dumpなどでチェックしてみてはどうでしょうか?

必ず入っていなければならないのであれば、

if(isset($worddata['word_name'])) {

return false;

}

などとして処理を中断するなどをしてはどうでしょうか。

id:seadwell

こんにちは、ご回答ありがとうございます。

if(isset($worddata['word_name'])) {

return false;

}

で逃げたつもりですが、なんか処理は進み前進はあったものの違うエラーが出てきました。

以下のコメントに、DBルーチンに飛ばす前ののコードを書いてみました。

お時間があれば、アドバイスなどいただければ幸いですm(_ _)m

2007/10/23 18:09:04

その他の回答(1件)

id:tezcello No.1

tezcello回答回数460ベストアンサー獲得回数692007/10/23 08:46:06

ポイント50pt

エラーメッセージは、未定義の添字ですから、関数に引き渡された値を確認してみては?

例えば、(A)の前に、

var_dump($worddata);

を入れてみるとか。


もしかしたら、この関数が呼ばれるのはform等から何か送られてくるのを前提としているのでは?

最初にそのformを表示する時も呼んでしまっていて、$worddata['word_name'] などは未定義のままとか?

id:seadwell

> はform等から何か送られてくるのを前提としているのでは?

> 最初にそのformを表示する時も呼んでしまっていて、$worddata['word_name'] などは未定義のままとか?

全くそのとおりです^^;

PHPというかプログラムを始めたばかりで独学なので、何が問題なのか?切り分けられてないのです。

以下のコメントに、DBルーチンに飛ばす前ののコードを書いてみました。

もしよろしければ、アドバイスなどいただければ幸いですm(_ _)m

2007/10/23 17:56:00
id:zebevogue No.2

zebevogue回答回数65ベストアンサー獲得回数72007/10/23 09:45:56ここでベストアンサー

ポイント50pt

引数に指定している$worddataにインデックスが無いらしいので、

関数に入った直後の値をvar_dumpなどでチェックしてみてはどうでしょうか?

必ず入っていなければならないのであれば、

if(isset($worddata['word_name'])) {

return false;

}

などとして処理を中断するなどをしてはどうでしょうか。

id:seadwell

こんにちは、ご回答ありがとうございます。

if(isset($worddata['word_name'])) {

return false;

}

で逃げたつもりですが、なんか処理は進み前進はあったものの違うエラーが出てきました。

以下のコメントに、DBルーチンに飛ばす前ののコードを書いてみました。

お時間があれば、アドバイスなどいただければ幸いですm(_ _)m

2007/10/23 18:09:04
  • id:seadwell
    DBルーチンに飛ばす前の処理を抜粋しました。
    コメント(B)でエラーが出ます。

    また、コメント(A)のところでカウントを一つ加算したいのですがこれもエラーがでます。
    多分、tezcelloさんがおっしゃっていることだと思うのですが、でも、実際どうやればいいのかわかりません><
    var_dump($word_data);で覗いてみたところ、intのはずがstringになっているのでこれかもしれません。

    よろしくお願いします。



    <?php
    // ワードをGETし、DB検索用に文字コード変換
    $worddata['word_name'] = $_GET['tag'];
    $worddata['word_name'] = mb_convert_encoding($worddata['word_name'], "EUC-JP", "UTF-8");
    list($word_data, $count) = db_search_wordmaster($conn, $worddata);

    var_dump($worddata);
    var_dump($word_data);
    echo($count);

    if($count == 0){
    lock_tables($conn, 'word_master');
    db_regist_wordmaster($conn, $worddata);
    unlock_tables($conn);
    }else{
    if(isset($word_data['word_name']) || isset($word_data['word_count'])) {
    return false;
    }else{
    $word_data['word_count']++; //(A)
    lock_tables($conn, 'word_master');
    db_modify_wordmaster($conn, $word_data); //(B)
    unlock_tables($conn);
    }
    }
    ?>
  • id:seadwell
    解りました!!

    上記コメント
    > ist($word_data, $count) = db_search_wordmaster($conn, $worddata);

    function db_search_wordmaster
    の部分で検索結果の配列とカウントを取得するため、サブルーチンに飛ばしていたのですが、そこが多次元配列にしていたため、
    > $worddata['word_name'] = addslashes($worddata['word_name']); //(A)
    の書き方が間違えていました。
    正しくは、
    $worddata['word_name'] = addslashes($worddata[0]['word_name']);
    という、くだらない落ちでした。
    早速、配列の別なサブルーチンも作らねば・・・。

    クッソー!
    修行が足らん!!

    tezcelloさん、zebevogueさんアドバイスいただいたおかげで、違う角度から見ることが出来ました。
    ありがとうございました^^/
  • id:tezcello
    自己解決された様ですが、気になった点を...(db_search_wordmaster() が何をやっているかは、正確には分からないのでハズしている可能性大ですが)

    list($word_data, $count) = db_search_wordmaster($conn, $worddata);
    で、検索したい文字列等を格納した連想配列 $worddata , $conn (内容不明、DBのリソースID?)を渡して、結果 $word_data, $count を得ていると思います。
    この $count が、0 の場合、新規登録を行い、それ以外に注目します。

    if(isset($word_data['word_name']) || isset($word_data['word_count'])) {
    return false;
    }
    この部分で、$word_data['word_name']), $word_data['word_count'] のどちらか一つでも定義済みであれば、関数を抜け、false を返します。
    つまりこれ以降の
    $word_data['word_count']++;
    ...
    db_modify_wordmaster($conn, $word_data);
    ...
    が実行されるのは、$word_data['word_name']), $word_data['word_count'] がどちらも未定義の場合です。
    ですから、これらの行でエラーが出るのは当然です。(未定義の値をインクリメントしたり、参照しようとする訳ですから)
    それとも、
    $word_data['word_name']), $word_data['word_count']  がひとつでも定義されている場合は false を返すのみで修正処理(db_modify_wordmaster())が不要、
    $word_data['word_name']), $word_data['word_count']  が共に未定義の場合は、$word_data[0]['word_name']), $word_data[0]['word_count']  の値を用いて修正処理が必要。
    というのが仕様なのでしょうか?  それならOKですけど。

    > 早速、配列の別なサブルーチンも作らねば・・・。
    配列の場合を特別に用意しなくても、
    形として2次元配列になってしまうだけであれば、
    db_modify_wordmaster($conn, $word_data[0]);
    とするだけ、
    複数の検索結果が得られるのならば、
    foreach ( $word_data as $wd){
    $wd['word_count']++;
    lock_tables($conn, 'word_master');
    db_modify_wordmaster($conn, $wd);
    unlock_tables($conn);
    }
    で問題無いような...

    > $worddata['word_name'] = addslashes($worddata[0]['word_name']);
    で解決したのなら、
    > var_dump($word_data);で覗いてみたところ、intのはずがstringになっているのでこれかもしれません。
    と少しずれる気が...
    var_dump($word_data);
    の結果は、
    array(1) {
    [0]=>
    array(2) {
    ["word_name"]=>
    string(7) "abcdefg"
    ["word_count'"]=>
    int(1)
    }
    }
    のように二重の配列であると表示されると思うのです。(内側の配列についての事かも知れませんが)
    まあ、PHPは型が厳密ではありませんから、数値の1が入っているはずの所に文字の1が入っていても問題にならないでしょうね。
    全く別の文字が入っているのでしたら、db_search_wordmaster() での設定がおかしいです。
  • id:seadwell
    わざわざご丁寧に、フォローまでありがとうございます。

    > これらの行でエラーが出るのは当然です。
    なんか変だな~??と思い、今は、若干コードを変えてます。

    if (isset($_GET['tag']) && $_GET['tag'] != ""){
    // ワードをGETし、DB検索用に文字コード変換
    $worddata['word_name'] = $_GET['tag'];
    $worddata['word_name'] = mb_convert_encoding($worddata['word_name'], "EUC-JP", "UTF-8");
    // ワードDB検索
    list($word_data, $count) = db_search_wordmaster($conn, $worddata);

    if ($count === 0){
    // DBに存在しない場合、ワード書き込み記録
    lock_tables($conn, 'word_master');
    db_regist_wordmaster($conn, $worddata);
    unlock_tables($conn);
    }else{
    // DBに存在した場合、ワードカウントアップ
    $word_data['word_count']++;
    lock_tables($conn, 'word_master');
    db_modify_wordmaster($conn, $word_data);
    unlock_tables($conn);
    }
    }else{
    error_routine();
    }


    > 配列の場合を特別に用意しなくても・・・
    配列にする事が結構多いので、別にサブルーチンを作ろうと考えました。
    また、なんか気分の問題で、2次元配列と多次元配列のルーチンを明確に分け今後凡ミスをしないようにと・・・。

    function simple_array($conn, $sql){

    $result = execute_sql($conn, $sql);

    $data = array();
    while ($rs = $result->fetchRow(DB_FETCHMODE_ASSOC)) {
    foreach( $rs as $key => $value){
    //$value = sjis2euc_for_Winodows($value);
    $data[$key] = $value;
    }
    }

    // 検索件数
    $count = $result->numRows();

    // クエリー結果セットの開放
    $result->free();
    return array($data, $count);
    }


    >> var_dump($word_data);で覗いてみたところ、intのはずがstringになっているのでこれかもしれません。
    > と少しずれる気が...

    はい。
    丸っきりずれていました^^;

    > のように二重の配列であると表示されると思うのです。
    全くその通りでした。
    本来は、$word_data[0]['word_count']++;
    でした。
    しかし今回、2次元配列のルーチンを増やし、そこに飛ばすようにしたことでこのエラーを回避しました。


    いろいろ、ご指導くださりありがとうございます。
  • id:tezcello
    蛇足部分にまでコメントしていただいてありがとうございます。
    プログラムの完成をお祈りいたします。

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

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

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

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません