PHP+MySQL+Smartyに関するご質問です。


一度登録したダンススクールを編集する画面を制作しています。

▽ここから

■PHP
//スクール情報(ダンスジャンル)を出力
$rs = mysql_query("SELECT genre FROM dtb_school WHERE school_id='$id'");
$array = mysql_fetch_assoc($rs);
$smarty->assign("genre_check",array($array['genre']));

■テンプレート
<!--{html_checkboxes name="genre" selected="$genre_check" options="$genreCheckBoxes"}-->

△ここまで

で該当する項目にチェックが入りません。

$array['genre']は「バレエ,ヒップホップ,」なので
$smarty->assign("genre_check",array(バレエ,ヒップホップ,));

ではチェックが入ります。
何が原因でしょうか?またどのやれば認識されますか?

宜しくお願い致します。

回答の条件
  • URL必須
  • 1人2回まで
  • 登録:
  • 終了:2009/05/18 19:26:28
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

ベストアンサー

id:pahoo No.2

回答回数5960ベストアンサー獲得回数633

ポイント60pt

まず確認ですが、MySQLデータベースの genre フィールドには "バレエ,ヒップホップ" というように、カンマ区切りでダンスジャンルが登録されているのですよね。

となると、ご質問のスクリプトでは、下記のように配列の要素は1つしか渡されていないことになります。

$smarty->assign("genre_check", array('バレエ,ヒップホップ'));

目的としていることは、カンマ区切りで2つの要素に分離することでしょうから、関数 mb_split を使います。また、変数 $array が関数 array と同名というのもバグのもとになりかねないので、変更します。

ご質問のPHPスクリプトを下記に差し替えてみてください。

//スクール情報(ダンスジャンル)を出力
$InternalEncoding = 'UTF-8'; //処理している日本語の文字コードを設定してください
mb_internal_encoding($InternalEncoding);
mb_regex_encoding($InternalEncoding);
$rs = mysql_query("SELECT genre FROM dtb_school WHERE school_id='$id'");
$arr = mysql_fetch_assoc($rs);
$chk_options = mb_split(',', $arr);
$smarty->assign("genre_check", $chk_options);
id:gelgelgel

>ご質問のスクリプトでは、下記のように配列の要素は1つしか渡されていないことになります。

なるほどよく分かりました!!

差し替えたところうまく動作しました!!

ありがとうございました!!

2009/05/18 19:25:25

その他の回答1件)

id:kn1967 No.1

回答回数2915ベストアンサー獲得回数301

ポイント10pt
$smarty->assign("genre_check",array($array['genre']));

では

$smarty->assign("genre_check",array(array(バレエ,ヒップホップ)));

となってしまうので単純に

$smarty->assign("genre_check", $array['genre']);

ではないかと思いますよ。


URL必須なので、とりあえずマニュアル ↓

id:gelgelgel

ちょっと関数がややこしかったですが、上記でもあるとおり

$array['genre']は「バレエ,ヒップホップ,」なのでそういうことではないです。

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

2009/05/18 19:25:47
id:pahoo No.2

回答回数5960ベストアンサー獲得回数633ここでベストアンサー

ポイント60pt

まず確認ですが、MySQLデータベースの genre フィールドには "バレエ,ヒップホップ" というように、カンマ区切りでダンスジャンルが登録されているのですよね。

となると、ご質問のスクリプトでは、下記のように配列の要素は1つしか渡されていないことになります。

$smarty->assign("genre_check", array('バレエ,ヒップホップ'));

目的としていることは、カンマ区切りで2つの要素に分離することでしょうから、関数 mb_split を使います。また、変数 $array が関数 array と同名というのもバグのもとになりかねないので、変更します。

ご質問のPHPスクリプトを下記に差し替えてみてください。

//スクール情報(ダンスジャンル)を出力
$InternalEncoding = 'UTF-8'; //処理している日本語の文字コードを設定してください
mb_internal_encoding($InternalEncoding);
mb_regex_encoding($InternalEncoding);
$rs = mysql_query("SELECT genre FROM dtb_school WHERE school_id='$id'");
$arr = mysql_fetch_assoc($rs);
$chk_options = mb_split(',', $arr);
$smarty->assign("genre_check", $chk_options);
id:gelgelgel

>ご質問のスクリプトでは、下記のように配列の要素は1つしか渡されていないことになります。

なるほどよく分かりました!!

差し替えたところうまく動作しました!!

ありがとうございました!!

2009/05/18 19:25:25
  • id:kn1967
    データベースの決まり事として「1フィールドには1データ」というのがあるため
    genreフィールドにバレエとヒップホップの両方が一緒に入るという事態は想定外でした。

    そのため実際のデータは
      $array['genre'][0] = 'バレエ'
      $array['genre'][1] = 'ヒップホップ'
    という具合だと想像を膨らませて回答いたしました。

    以上、回答1の言い訳です。頭固いかもしれません。
  • id:pahoo
    質問者の方が混乱するといけないので、コメントを――「1フィールドには1データ」は絶対的ではありません。

    かつては「1フィールドには1データ」をルールとして設計していた時代もありましたが、インターネット時代になり、HTMLのチェックボックスで入力されるような連想配列を扱わなければならなくなりました。ところが、連想配列を MySQL のような RDBMS に格納するのは、原理的に無理があることが分かっています。
    もし「1フィールドには1データ」を守るなら、無限にフィールドを用意するか、個々の要素を分解したテーブルへのリレーションを張るしかないためです。前者はナンセンスですし、後者はDBコストがかかりすぎます(レスポンス低下の原因になる)。
    理想をいえば XML型DB のようなオブジェクト指向のDBMSを使うべきなのですが、適当な製品が市場に現れていない現状では、gelgelgel さんが採られているカンマ区切りで配列そのものを1フィールドに格納するというのが、もっとも現実的な対応策です。
  • id:kn1967
    >無限にフィールドを用意する
    >個々の要素を分解したテーブルへのリレーション

    さすがに横に伸ばしはしませんね。
    別にリレーション張らなくても単純にレコード数を増やします。
    (PostgreSQLの配列フィールドがもう少し使いやすければ使うのだけど
     MySQLなどには無い機能だから使いまわしができないんだよね)

    確かにレスポンスは若干落ちるけどメンテナンスや
    データの使いまわしなどを考えると総合的に楽。

    もちろん、非正規化がダメなどとは言わないが、基本をおさえた上での話。
    ・・・などと言っても、今回の質問と直接関係は無いのでこの辺で。
  • id:gelgelgel
    pahooさん,kn1967さん

    丁寧に補足して頂きありがとうございました。
    私は初心者&独学なので当初はkn1967さんのやり方を
    考えていたのですが、他の表示などの兼合いなどで
    管理のしやすさから選択致しました。

    他にも色々なDBや管理方法があるとのことで
    大変勉強になりました。

    ありがとうございました。

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

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

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

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