重要なお知らせ

「教えて! goo」は2025年9月17日(水)をもちまして、サービスを終了いたします。詳細はこちら>

【解消】通知が届かない不具合について

こんにちは。

MySQLのデータをphpで管理するページを作っていますが、壁にぶつかってしまいました。

データベースのあるフィールドに、「あああ」「いいい」「ううう」というようにいろんな言葉が登録されています。

これらを削除・追加するために、phpで取り出して、チェックボックスでリストアップします。
リストにない言葉は新たに登録できるように、テキストフィールドも用意しています。

□あああ □いいい □ううう 新規:[   ](テキストフィールド)

というふうにです。

このフォームはちゃんと機能していまして、追加した言葉はデータベースに記録されているのですが、なぜかフォームにリストアップされないのです。

例えば、

   □あああ □いいい □ううう 新規:[   ]

で、新規のところに「かかか」と入れて送信すると、

   □あああ □いいい □ううう □かかか 新規:[   ]

となってほしいわけですけど、

   □あああ □いいい □ううう □ 新規:[   ]

となってしまうのです。

フォームを使って送信した言葉が、データベースに記録されていながら、取り出せないというのは、何が原因だと考えられるでしょうか?

何かすごく単純なことのような気がするので、ソースは載せないでおきます。
ご教示をよろしくお願いいたします。

A 回答 (6件)

「array_unique()」の挙動が質問者の意図するものではないということが原因でしょう。

「$results」をダンプしてみると意味が分かるはずです。

「foreach」構文を利用してインプット要素を表示するように修正すれば、意図する動作になるかと思います。

躓いたときは、落ち着いてマニュアルを参照することが大事です。

参考URL:http://www.php.net/manual/ja/function.array-uniq …
    • good
    • 0
この回答へのお礼

ありがとうございます。

foreachを使うことで、あっさり解決してしまいました。

今回のことではいろいろ勉強になりました。
ご回答くださった皆様には深くお礼申し上げます。

お礼日時:2010/02/25 23:32

すみません、自分の環境で再現できなかったのでおうかがいします。


$kotoba = preg_split('/\//',$row["kotoba"],-1,PREG_SPLIT_NO_EMPTY);
print_r($kotoba);
exit;

とすると、どのような結果になりますか?
よろしければ教えてください。

この回答への補足

preg_splitの行の真下にご指定の2行を入れると、
データベースの最初のデータだけを/で分割して返してきます。

最初のデータは「あああ/いいい/ううう」ですので、

Array ( [0] => あああ [1] => いいい [2] => ううう )

となります。

補足日時:2010/02/25 21:04
    • good
    • 0

>言葉なしのチェックボックスだけ



ああ、たしかにそう書いてありますね。見落としてました。

おそらく日本語の文字コードの問題かと。
「かかか」のような日本語ではなく「kakaka」でやっても
同じでしょうか?

もしkakakaが通るようなら、

$db = mysql_select_db($mydb, $link);
したあとに
$result = mysql_query("SET NAMES '正しいキャラクターコード'");

的なものを発行してから、ためしてみては?

また、kakakaも通らないようであれば$_POSTがうまく渡ってないのでは?どこかに
print_r($_POST["kotoba"]);
などしてデバッグしてみてください
    • good
    • 0
この回答へのお礼

たびたびありがとうございます。

kakakaも同様です。

print_r($_POST["kotoba"]);をどこかに入れて、「かかか」と送信すると、
Array ( [0] => かかか ) と出ますので、ちゃんと渡せているようです。


ところで、一つ気付いたことがあります。

最初の、何も問題がなかった時点。

  □あああ □いいい □ううう 新規:[   ]

ここで「かかか」と入れると、

  □あああ □いいい □ううう □ 新規:[   ]

となると書きました。そこでこのまま「kakaka」と入れると、予想通りに、

  □あああ □いいい □ううう □ □ 新規:[   ]

となり、もう一度、「sasasa」と入れると、

  □あああ □いいい □ううう □ □ □ 新規:[   ]

となったのですが、今度は「tatata」と入れてみたら、

  □あああ □いいい □ううう □ □ □ □かかか 新規:[   ]

と、前に入れた「かかか」が出てきたのです。
そこでこのまま「れれれ」と入れてみましたら、

  □あああ □いいい □ううう □ □ □ □かかか □kakaka 新規:[   ]

と出てきました。
私にはさっぱりわけがわかりませんが、何か解決の手がかりになりますでしょうか?

お礼日時:2010/02/25 16:39

すみません、以下お伺いしたいです。



・var_dump()などを使ってselect文の結果セットの中身は確認しましたか?
・文字列をそのまま配列に入れて登録しているのでしょうか?
・checkboxリストアップのためのループで、繰り返す回数は正しいですか?
※たぶんcount()の値を繰り返し回数にしているとは思いますが念のため…

この回答への補足

var_dump()で中身は確認しています。フォームで送った言葉はちゃんと入っています。

フォームで送った文字列は、複数ある場合は、implodeで「/」を間に入れて、一つの文字列として登録しています。

checkboxのリストアップは、count()でループ回数を出してます。

補足日時:2010/02/25 14:19
    • good
    • 0
この回答へのお礼

すみません、この欄にソースを貼り付けさせていただきます。

----------------------------------
if (isset($_POST["new"])) {
$link = mysql_connect($server, $usr, $pass);
$db = mysql_select_db($mydb, $link);

$id = $_POST["id"];
$id = quotemeta($id);
if($_POST["kotoba"]<>''){$kotoba = implode("/",$_POST["kotoba"]);}
$kotoba = quotemeta($kotoba);

$result = mysql_query("INSERT INTO $table VALUES(NULL, '$kotoba')");

}

$link = mysql_connect($server, $usr, $pass);
$db = mysql_select_db($mydb, $link);

$items = mysql_query("SELECT DISTINCT kotoba FROM $table");

print("<form action='test.php' method='post'>\n");

while($row = mysql_fetch_assoc($items)){

$kotoba = preg_split('/\//',$row["kotoba"],-1,PREG_SPLIT_NO_EMPTY);
$i = 0;
while($i < count($kotoba)){
$ar_kotoba[] = $kotoba[$i];
$i++;
}
}
$results = array_unique($ar_kotoba);

$i = 0;
while($i < count($results)){
print("<input type='checkbox' name='kotoba[]' value='$results[$i]'>$results[$i]\n");
$i++;
}

print("<br>新規<input type='text' name='kotoba[]' size='10'>\n");
print("<input type='submit' name='new' value='追加'>\n");
print("</form>\n");

mysql_close($link);
----------------------------------

どうぞよろしくお願いします。

お礼日時:2010/02/25 14:44

>データベースに記録されていながら、取り出せない



登録と参照の順番が逆にになっているとか?
参照してから登録すれば当然新規登録したものは1回目は
参照されません。

また、なんらかの理由でフラグ管理をしていて、通常登録では
表示フラグがfalseになっている・・・なんてことはないですか?
私がシステムを組むなら必ず表示フラグをつけますので
(別名削除フラグ)

この回答への補足

登録と参照が逆ですと、登録前と同じリストの内容になるはずですよね?
でも、登録後は、言葉なしのチェックボックスだけになってしまうのです。

フラグについては、よくわかりません...

いま、余計な部分を削除したソースを作っていますので、後ほど掲載させていただきます。

補足日時:2010/02/25 14:25
    • good
    • 0

ソースないので・・・単純な話、コミットしてます?



オート・コミットならSQL実行時に自動的にコミットされますが、オート・コミットでないと・・・コミットしないとdbは確定しないと思います。

この回答への補足

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

コミットって知らなかったのですけど、SELECT @@autocommitというのを実行したら「1」が返ってきたので、コミットされてるということですよね?

やはりソースを載せた方が良いでしょうか?

補足日時:2010/02/25 07:30
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!