• ベストアンサー

【php MySQL】データが取り出せない

こんにちは。 MySQLのデータをphpで管理するページを作っていますが、壁にぶつかってしまいました。 データベースのあるフィールドに、「あああ」「いいい」「ううう」というようにいろんな言葉が登録されています。 これらを削除・追加するために、phpで取り出して、チェックボックスでリストアップします。 リストにない言葉は新たに登録できるように、テキストフィールドも用意しています。 □あああ □いいい □ううう 新規:[   ](テキストフィールド) というふうにです。 このフォームはちゃんと機能していまして、追加した言葉はデータベースに記録されているのですが、なぜかフォームにリストアップされないのです。 例えば、    □あああ □いいい □ううう 新規:[   ] で、新規のところに「かかか」と入れて送信すると、    □あああ □いいい □ううう □かかか 新規:[   ] となってほしいわけですけど、    □あああ □いいい □ううう □ 新規:[   ] となってしまうのです。 フォームを使って送信した言葉が、データベースに記録されていながら、取り出せないというのは、何が原因だと考えられるでしょうか? 何かすごく単純なことのような気がするので、ソースは載せないでおきます。 ご教示をよろしくお願いいたします。

  • PHP
  • 回答数6
  • ありがとう数5

質問者が選んだベストアンサー

  • ベストアンサー
noname#243182
noname#243182
回答No.6

「array_unique()」の挙動が質問者の意図するものではないということが原因でしょう。「$results」をダンプしてみると意味が分かるはずです。 「foreach」構文を利用してインプット要素を表示するように修正すれば、意図する動作になるかと思います。 躓いたときは、落ち着いてマニュアルを参照することが大事です。

参考URL:
http://www.php.net/manual/ja/function.array-unique.php
kota7691
質問者

お礼

ありがとうございます。 foreachを使うことで、あっさり解決してしまいました。 今回のことではいろいろ勉強になりました。 ご回答くださった皆様には深くお礼申し上げます。

その他の回答 (5)

  • 20091110
  • ベストアンサー率66% (2/3)
回答No.5

すみません、自分の環境で再現できなかったのでおうかがいします。 $kotoba = preg_split('/\//',$row["kotoba"],-1,PREG_SPLIT_NO_EMPTY); print_r($kotoba); exit; とすると、どのような結果になりますか? よろしければ教えてください。

kota7691
質問者

補足

preg_splitの行の真下にご指定の2行を入れると、 データベースの最初のデータだけを/で分割して返してきます。 最初のデータは「あああ/いいい/ううう」ですので、 Array ( [0] => あああ [1] => いいい [2] => ううう ) となります。

  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.4

>言葉なしのチェックボックスだけ ああ、たしかにそう書いてありますね。見落としてました。 おそらく日本語の文字コードの問題かと。 「かかか」のような日本語ではなく「kakaka」でやっても 同じでしょうか? もしkakakaが通るようなら、 $db = mysql_select_db($mydb, $link); したあとに $result = mysql_query("SET NAMES '正しいキャラクターコード'"); 的なものを発行してから、ためしてみては? また、kakakaも通らないようであれば$_POSTがうまく渡ってないのでは?どこかに print_r($_POST["kotoba"]); などしてデバッグしてみてください

kota7691
質問者

お礼

たびたびありがとうございます。 kakakaも同様です。 print_r($_POST["kotoba"]);をどこかに入れて、「かかか」と送信すると、 Array ( [0] => かかか ) と出ますので、ちゃんと渡せているようです。 ところで、一つ気付いたことがあります。 最初の、何も問題がなかった時点。   □あああ □いいい □ううう 新規:[   ] ここで「かかか」と入れると、   □あああ □いいい □ううう □ 新規:[   ] となると書きました。そこでこのまま「kakaka」と入れると、予想通りに、   □あああ □いいい □ううう □ □ 新規:[   ] となり、もう一度、「sasasa」と入れると、   □あああ □いいい □ううう □ □ □ 新規:[   ] となったのですが、今度は「tatata」と入れてみたら、   □あああ □いいい □ううう □ □ □ □かかか 新規:[   ] と、前に入れた「かかか」が出てきたのです。 そこでこのまま「れれれ」と入れてみましたら、   □あああ □いいい □ううう □ □ □ □かかか □kakaka 新規:[   ] と出てきました。 私にはさっぱりわけがわかりませんが、何か解決の手がかりになりますでしょうか?

  • 20091110
  • ベストアンサー率66% (2/3)
回答No.3

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

kota7691
質問者

お礼

すみません、この欄にソースを貼り付けさせていただきます。 ---------------------------------- 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); ---------------------------------- どうぞよろしくお願いします。

kota7691
質問者

補足

var_dump()で中身は確認しています。フォームで送った言葉はちゃんと入っています。 フォームで送った文字列は、複数ある場合は、implodeで「/」を間に入れて、一つの文字列として登録しています。 checkboxのリストアップは、count()でループ回数を出してます。

  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.2

>データベースに記録されていながら、取り出せない 登録と参照の順番が逆にになっているとか? 参照してから登録すれば当然新規登録したものは1回目は 参照されません。 また、なんらかの理由でフラグ管理をしていて、通常登録では 表示フラグがfalseになっている・・・なんてことはないですか? 私がシステムを組むなら必ず表示フラグをつけますので (別名削除フラグ)

kota7691
質問者

補足

登録と参照が逆ですと、登録前と同じリストの内容になるはずですよね? でも、登録後は、言葉なしのチェックボックスだけになってしまうのです。 フラグについては、よくわかりません... いま、余計な部分を削除したソースを作っていますので、後ほど掲載させていただきます。

回答No.1

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

kota7691
質問者

補足

ご回答ありがとうございます。 コミットって知らなかったのですけど、SELECT @@autocommitというのを実行したら「1」が返ってきたので、コミットされてるということですよね? やはりソースを載せた方が良いでしょうか?

関連するQ&A

  • PHPとMySQLを使ったフォームを作っていますが、うまくできないこと

    PHPとMySQLを使ったフォームを作っていますが、うまくできないことがあり書き込みさせていただきます。 わかる方、ご助力願えれば幸いです。 フォームから、送信されたデータを受け取って、MySQLに登録する際に、フォーム内に空欄があると、うまくMySQLのデータベースに追加ができなかったり、変更ができなかったりします。 コードを簡単に書くと… <?php //フォームからデータを取得 $name = $_POST['name']; $address = $_POST['address']; $age = $_POST['age']; //データベース接続処理 $db = mysql_connect("localhost","user","password"); mysql_select_db("db_name",$db); $rs = mysql_query("select * from tablename order by my_id desc",$db); //データベースへの登録 $rs = mysql_query("INSERT INTO tablename(name,address,age)VALUES('$name','$address','$age')",$db); ?> このような感じになります。 フォームには、名前、住所、年齢を入力しているわけですが、年齢が必須でないため、空欄として送られてくることもあります。 年齢に数値が入っている場合は、うまく登録されますが、空欄であった場合、特にエラーが出るわけでもなく、単に「登録されない」という状況がおきます。 データベースのテーブルのフィールドでは、ageは int(11)でNULLはYes、defaultはNULLになっております。 自分なりに調べてみたつもりですが、知りたい情報に出合うことができませんでした。 よろしくお願い致します。

    • ベストアンサー
    • PHP
  • mysql+php リストボックスについて

    リストボックスを使ってmysqlのテーブルから データを得たデータをテキストボックスに入れる方法で悩んでいます。 やりたいことはこんな感じです。 [商品A▼]←リストボックス リストボックスの内容は               データベースより取得 [230 ]円←テキストボックス mysqlテーブル 商品  値段 商品A 230 商品B 460 商品Aを選ぶと自動的にテキストボックスに値段が 入るようにしたいのですが・・リストボックスの データを拾ってくることはできるのですが、テキスト ボックスに入力することができません。やり方を ご教授お願いします。

  • PHP+MySQLでこのようなシステム

    PHPとMySQLで、このようなシステムを作れないかと考えているのですが、可能か不可能か、もしくはヒントだけでもいただだけないかと思い、質問させていただきました。 まず、PHP+MySQLというのは、javascriptとかも初心者用の本を買ったりしたのですが、こういうところに使うとかいまいち理解できず、 現在PHP+MySQLと必要な時だけjavascriptのサンプルをコピペとかで使って事足りているということです。 PHP+MySQLの知識は、浅い方ですが、データベースを使っての表示や条件抽出くらいはできるくらいです。 主に使うデータベース・ページは、下記の通りです。 データベース内にテーブルが複数あります。 ・table_01 ・table_02 ・table_03 全テーブルデータの一覧を表示させるPHP(1ページ20件毎に表示させています) ・itiran.php 各会員ページのPHP ・mypage.php 「このようなシステム」というのは、 ・一覧ページ【itiran.php】に[追加]ボタンを作り、[追加]を押すと会員ページ【mypage.php】に追加した商品が一覧として表示される ・【itiran.php】および【mypage.php】で追加した商品を一覧から[削除]できる ・【itiran.php】の各商品には、追加している人数[登録数]が表示される([削除]した場合は、人数は-1となる) 【itiran.php】テーブル例 ┼───┼───┼───────┼───┼ │NAME│ZAIKO│お気に入り    │登録数│ ┼───┼───┼───────┼───┼ │ポニョ │2,000 │ 追加       │500 │ ┼───┼───┼───────┼───┼ │ゲド  │1,000 │ 追加       │300 │ ┼───┼───┼───────┼───┼ │トトロ │9,000  │登録済み・・削除│100 │ ┼───┼───┼───────┼───┼ ・データベースは、各テーブル更新があった場合、一度の更新数が多くいので、1テーブルまるごとCSVで更新しています。 ・登録数を、このテーブル内に入れておいた方が良いのでしょうか。 参考になるようなサイトもなく、PHP+MySQL可能か不可能か、もしくはヒントだけでもお願い致します。

    • ベストアンサー
    • PHP
  • mysqlへのデータ挿入

    HTMLによる送信フォームからデータを挿入するプログラムを作っているのですが、妙なエラーが出ます。 フォームにデータを入れ送信ボタンを押すとview.phpにpostをつかって渡すはずなんですが、なぜか送信ボタンを押すとview.phpをダウンロードしますか?みたいなダイアログが出てきてしまいます。開く、保存、キャンセルが選べるあのダイアログです。 このプログラムのコード自体はテキストの公式サイトからコピーしていますので記述ミスはないはずなんです。 データベースもちゃんユーザー名やパスワードなどは当たっていると思います。 PHPとmysqlのバージョンなども問題ないかと思われます。 PEARを使いデータベース接続処理をしていて、データを1件、挿入しましたと表示されるずなんですが・・・ mysqlへの接続だけのサンプルなら成功しています。 ちなみにview.phpだけを実行すると「DB Errow:syntax error」と表示されています。 かなりめちゃくちゃな質問になってしまっていて申しわけありません。 思い当たる方がいれば回答お願いいたします。

    • ベストアンサー
    • PHP
  • Flash→PHP→MySQLへの値の受け渡しについて

    現在、Flashのフォームで受け取った値をPHP経由でMySQLへデータを格納するシステムを作成しています。 現在、詰まっている点とは、Flashで送信したデータがMySQLまで到達できないというところです。 少し分析してみたところ、PHPを単独でブラウザにて開くと "フィールドが取得できません。" と出力されていました。 これは、 ----- <?php $setsuzoku = mysql_connect("localhost", "*****", "*****"); if (! $setsuzoku) { die ("データベースに接続できません"); } if (! mysql_select_db ("test")) { die ("データベースが取得できません"); } mysql_query("INSERT INTO rank VALUES('".$HTTP_GET_VARS['nickname']."', ".$HTTP_GET_VARS['score']); if (!$fd) { die ("フィールドが取得できません。"); } // 処理が終わったことを知らせる print('OK'); ----- というプログラムで動かしていまして、『mysql_select_db ("test")』まで動作しているのではないかと思われます。 ですので、もしかしたらFlash以前にPHPとSQLの連携がうまくいっていないような気がするのですが…どうでしょうか? Flashからの情報を送信するシステムである以上、PHPで表示すると必ずこのような形になるのでしょうか? ちなみにMySQLには、必要なDatabaseとテーブルを作成しました。 問題の切り分けは一応してみましたが、間違っているかもしれません。何かご教授頂ければ幸いです。 よろしくお願いいたします。

    • ベストアンサー
    • Flash
  • MySQLが文字化けしてしまう

    MySQLが文字化けしてしまう 現在、PHPとMYSQLを使ってデーターベースに画像をアップするプログラムを作っています。 http://websegment.net/2010/09/05/php-mysql-blob/ のサイトのプログラムでまず作成してみたところデーターベースへの 登録はうまくいったのですが、ターミナルでテーブルを確認したところ文字化けしていました。 フィールドのfile、size辺りで文字化けしてしまっているようです。 どうすれば、文字化けが直るのでしょうか? 教えてください。

    • ベストアンサー
    • PHP
  • PHPでMySQLのユーザを追加したい。

    表題の件で頭を悩ませています。 Web上のフォームで入力したユーザ名を、 そのままMySQLのユーザ名として登録できるような物を作りたいのですが、 PHPにはMySQLのユーザを追加できるような関数はありません。 phpMyadminのように管理者がユーザを追加するのではなく、 一般の人間が希望のユーザ名をフォームに入力して「追加」などのボタンを押すと、 その名前をMySQLのユーザ名として登録したいのです。 何か良い方法は無いでしょうか? お知恵をお貸し下さい。

    • ベストアンサー
    • PHP
  • Web上(php)からmysqlにデータを挿入する

    授業評価アンケートのデータ収集システムを開発しています。 年度(セレクトボックス)[nendo]・学年(セレクトボックス)[gakunen]・クラス(セレクトボックス)[class]・科目名(テキストボックス)[kamokumei]・科目コード(テキストボックス)[kamokucode]・分類(セレクトボックス)[kind]・履歴者数(テキストボックス)[people] について、POST?hidden?でデータをページをまたいで持っていきます。 最終的に、アンケートの評価として、設問1~14のそれぞれについてA~F評価の人数を入力します。 表形式にしており、 設問1のA評価については、name="1A" 設問2のB評価については、name="2B" のようにしています。 そして、 「登録ボタン」 を押すと、 年度・学年・ ・・・ ・履歴者数 及び 設問1~14のそれぞれについてA~F評価の人数 をデータベースに挿入したいのですがわかりません。 データベースの構造は、 データベース名:student テーブル名:data field: nendo gakunen class kamokumei kamokucode kind people 1A 1B ・ ・ ・ 31F のようになっています。 今、挿入しようとしているアンケートについては、設問数は14です。 if文で、「分類」の選択(4つ)に応じて、設問数が変えたいため、31Fまでフィールドを用意しています。 今、挿入しようとしているものは年度や学年や・・・と、設問1~14のそれぞれについてA~F評価の人数ですが、フィールドが・・・31Fまであっても問題ないのでしょうか? <?php mysql_connect("localhost", "aiueo","##aiueo"); //データベースへ接続 mysql_select_db("aiueo"); //データベースを選択 $14F = $_POST["14F"]; $14E = $_POST["14E"]; $14D = $_POST["14D"]; ・ ・ ・ $people = $_POST["people"]; $kind = $_POST["kind"]; $kamokucode = $_POST["kamokucode"]; $kamokumei = $_POST["kamokumei"]; $class = $_POST["class"]; $gakunen = $_POST["gakunen"]; $nendo = $_POST["nendo"]; $sql = 'INSERT INTO `data` (`nendo`, `gakunen`, `class`, `kamokumei`, `kamokucode`, `kind`, `people`, `1A`, `1B`, `1C`, `1D`, `1E`, `1F`,・・・) VALUES     (\'\', \''.$nendo.\''.$gakunen.'\', \''.$class.'\', \''.$kamokumei.'\', \''.$kamokucode.'\',\''.$kind.', \',\''.$people.'\', \''.$1A.'\', \''.$1B.'\', \''.$1C.'\', \''.$1D.'\', \''.$1E.'\', \''.$1F.'\',・・・) mysql_query( $sql ); ?> のようにしています。 どなたか教えてください!!!

    • ベストアンサー
    • PHP
  • phpからmysqlの操作について

    phpでmysqlを操作してブラウザー上へレコードの全データをテーブル化して表示したとします。 表示されているレコードから任意のレコードを選択し削除するにはどうすればよいでしょうか。 削除のsqlは解りますが、ブラウザー上に表示されているデータを選択して内容をphpへ送信する方法がわかりません。 フィールドごとにチェックボックスを出力してvalue にフィールドの値をセットしておきsubmit ボタンでvalue値を送信するような方法でしょうか。 Visual Basic などではグッリドコントロールの何処が選択されているか取得できるので簡単ですが, php とブラウザーでそんなことができるとは思えません。 よろしくお願いいたします。 php も sql もWEB上にあります。

    • ベストアンサー
    • PHP
  • PHP&MySQLでチェックボックスの解除

    こんにちは。 雑誌の購入をチェックボックスで購入済み、未購入と管理をしています。 MySQLのテーブルは zasshiテーブルにnameフィールドとcheckフィールドがあります。 チェックが入れば、購入済みとしてMySQLのcheckフィールドに1を登録します。 検索をして雑誌名とチェックボックスを表示 checkフィールドに1が登録されているものをディフォルトでチェックがはいるようにはできました。 次に解除をできるようにしようと思ったのですが、チェックボックスのチェックを外して送信をすると何も受け取れないので、解除ができません。 検索でしぼりこんでの表示をしているので、チェックが入っていないものを全て0にすることもできないので、何かよい方法はないでしょうか? まとめると、現在checkフィールドに1で登録されているものをチェックボックスの解除で0にしたいということです・・・ 拙い文章にわかりにくいかと思いますが,どうかよろしくお願いします。

    • ベストアンサー
    • PHP

専門家に質問してみよう