エラー箇所は(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);
}
引数に指定している$worddataにインデックスが無いらしいので、
関数に入った直後の値をvar_dumpなどでチェックしてみてはどうでしょうか?
必ず入っていなければならないのであれば、
if(isset($worddata['word_name'])) {
return false;
}
などとして処理を中断するなどをしてはどうでしょうか。
エラーメッセージは、未定義の添字ですから、関数に引き渡された値を確認してみては?
例えば、(A)の前に、
var_dump($worddata);
を入れてみるとか。
もしかしたら、この関数が呼ばれるのはform等から何か送られてくるのを前提としているのでは?
最初にそのformを表示する時も呼んでしまっていて、$worddata['word_name'] などは未定義のままとか?
コメント(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);
}
}
?>
上記コメント
> 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さんアドバイスいただいたおかげで、違う角度から見ることが出来ました。
ありがとうございました^^/
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() での設定がおかしいです。
> これらの行でエラーが出るのは当然です。
なんか変だな~??と思い、今は、若干コードを変えてます。
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次元配列のルーチンを増やし、そこに飛ばすようにしたことでこのエラーを回避しました。
いろいろ、ご指導くださりありがとうございます。
プログラムの完成をお祈りいたします。