PHP、MySQLについて質問です。


MySQLにINSERTするために下記のように書きました。
$sql = "INSERT INTO ".$table."
(
word , meaning , phoniticsign
) VALUES (
'".$word."','".$meaning."','".$phoniticsign."'
)";

INSERTする項目が増減するので、配列に入れて、
配列の要素が増減したら、自動的にMySQLにINSERTする項目も増減するよう、
下記のように書きましたがうまくいきません。
$itemsS =array('word' , 'meaning' , 'phoniticsign');
$sql = "INSERT INTO ".$table."
(
foreach($itemsS as $xxxx)
{
$xxxx.',';
}
) VALUES (
'".$word."','".$meaning."','".$phoniticsign."'
foreach($itemsS as $xxxx)
{
'".$xxxx."',;
}
)";

「'".$word."','".$meaning."','".$phoniticsign."'」を上手に表現できないとか、
MySQLの構文がちゃんとわかってないとかいろいろあるとおもうので、私の例にこだわらず、「配列の要素が増減したら、自動的にMySQLにINSERTする項目も増減するよう」にするにはどうしたら良いか教えてください。

OSはVista、IE、Firefox、最新のXampp、PHP5、EclipsePDT2を使ってます。
基本的な質問で恐縮ですが、よろしくお願いします。

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

ベストアンサー

id:taramonera No.2

回答回数79ベストアンサー獲得回数5

ポイント27pt

テーブルにインサートする「フィールド」と「値」を

別の配列にセットした場合、下記のようにすればよいです。


$itemsS =array('word', 'meaning', 'phoniticsign');//フィールド

$valuesS=array($word, $meaning, $phoniticsign);//値


$sql = "INSERT INTO ".$table." (".

implode(",", $itemsS).

") VALUES ('".

implode("','", $valuesS).

"')";

id:taroemon

コメント、ご回答ありがとうございます。

うまくいきました。

2010/05/05 13:06:53

その他の回答2件)

id:Committeeman No.1

回答回数153ベストアンサー獲得回数19

ポイント27pt

配列の1つめはテーブルのwordカラム、二つめはmeaning、三つめはphoniticsignにいれたいのなら下のようにします

$itemsS =array('word' , 'meaning' , 'phoniticsign');

$sql = "INSERT INTO " . $table . "(`word`,`meaning`,`phoniticsign`) VALUES ('" . join("','", array_pad($itemsS, 3, '')) . "')";

array_padは$itemsSの中身が1つや2つの場合に穴埋めする役目を果たしています

id:taroemon

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

array_padの使い方が参考になりました。

2010/05/05 13:05:55
id:taramonera No.2

回答回数79ベストアンサー獲得回数5ここでベストアンサー

ポイント27pt

テーブルにインサートする「フィールド」と「値」を

別の配列にセットした場合、下記のようにすればよいです。


$itemsS =array('word', 'meaning', 'phoniticsign');//フィールド

$valuesS=array($word, $meaning, $phoniticsign);//値


$sql = "INSERT INTO ".$table." (".

implode(",", $itemsS).

") VALUES ('".

implode("','", $valuesS).

"')";

id:taroemon

コメント、ご回答ありがとうございます。

うまくいきました。

2010/05/05 13:06:53
id:Bombastus No.3

回答回数409ベストアンサー獲得回数52

ポイント26pt

要素間にカンマを打たなければならないので、foreach より for 文を使った方がスマートです。以下の通り。

$itemsS =array('word' , 'meaning' , 'phoniticsign');
$n = count($itemsS);
$sql = "INSERT INTO {$table} (";
for ($i = 0; $i < $n; $i++) {
    if ($i == 0)    $sql .= $itemS[$i];
    else            $sql .= ", {$itemS[$i]}";
}
$sql .= ") VALUES ("
for ($i = 0; $i < $n; $i++) {
    if ($i == 0)    $sql .= "'{$$itemS[$i]}'";
    else            $sql .= ", '{$$itemS[$i]}'";
}
$sql .= ");"
id:taroemon

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

大変参考になりました。

やっぱりforでもいんですね。

2010/05/05 13:07:37
  • id:b-wind
    >配列の要素が増減したら、自動的にMySQLにINSERTする項目も増減するよう、
    とりあえず配列の要素とカラム名の関連性がよく分からんな。
    最低限配列が変化した場合にそれはカラム名なのか値なのか、
    カラム名なら代入する値は何か、値であるなら対象のカラム名は何かの対応が必要だろう。

    見る限りカラム名と値が同じ文字列にしようとしているとも見れるが、それに意味があるとも思えないし。
  • id:taroemon
    b-windさん
    ご指摘ありがとうございます。
    いろいろといたらず失礼しました。

    自分で作ったスクリプトをそのままコピペしてしまったので、不必要なほど変ななってるかもしれません。
    配列が「$itemsS =array('word');」の場合、
    $sql = "INSERT INTO ".$table."
    (word
    ) VALUES (
    '".$word."'
    )";

    そのあと配列の要素が増えた場合はINSERTする項目も下記のように増えるようにしたいのです。
    配列が「$itemsS =array('word' , 'meaning' , 'phoniticsign');」なら
    $sql = "INSERT INTO ".$table."
    (
    word , meaning , phoniticsign ・・・①
    ) VALUES (
    '".$word."','".$meaning."','".$phoniticsign."' ・・・②
    )";
    配列の要素の増減は①の部分と②の部分に増減を下記のように影響させたいです。
    ①$itemsS[0] , $itemsS[1] , $itemsS[2] , $itemsS[3] ,・・・(略)
    ②'" . $$itemsS[0] . "' , '" . $$itemsS[1] . "' , '" . $$itemsS[2] ."',・・・・(略)
    ちょっとおかしいいかもしれませんが、この形が表現できればこちらの環境だとちゃんと動くはずなんです。

    もう少し具体的に悩んでることを書くとするなら、
    MySQLの中に普通に繰り返し構文をつかっていいのか?使っていいとしたらどのようにするのが適切か?
    繰り返し構文を書くと、単語、単語、単語というように収まらず
    先頭か最後のどちらかに(、)カンマが残ってしまいます。


    あと、Values以下の「'".$word."','".$meaning."','".$phoniticsign."'」を消し忘れてました。
    本当は次のように書いたつもりでしたが見落としてました。
    VALUES (
    foreach($itemsS as $xxxx)
    {
    '".$xxxx."',;
    }
    )";

    いただいたコメントに対して適切なお返事になってるでしょうか?
    カラムって何?という低レベルな初心者なので、いろいろとご迷惑をおかけしております。
    ただし、私の摩訶不思議なコードにとらわれず、もっとスマートな方法がありましたら、どのように変えていただいても結構です。
    お時間のある時でもご指導ください。
  • id:taramonera
    回答しましたが、コメントを読んでおらず、読んで修正しました。


    $itemsS =array('word', 'meaning', 'phoniticsign');//フィールド

    foreach($itemsS as $key => $value){
    $valuesS[] = $$value;//値
    }

    $sql = "INSERT INTO ".$table." (".
    implode(",", $itemsS).
    ") VALUES ('".
    implode("','", $valuesS).
    "')";

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

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

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

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