• ベストアンサー
  • 困ってます

配列の初歩2

  • 質問No.3724289
  • 閲覧数80
  • ありがとう数3
  • 気になる数0
  • 回答数9
  • コメント数0

お礼率 21% (19/90)

PHP+MYSQLに挑戦しているプログラミング入門者です。、
昨日 http://oshiete1.goo.ne.jp/qa3720566.html
に続き全く初歩的な質問で申し訳ございません。
知識が乏しいため本を読んでもわからず、
いろいろ試してもだめなため、再度質問させていただきます。



t1
+-+-+
|n|n2|
+-+-+
|1|2|
+-+-+
|3|4|


$bat=array(5=>6,6=>7,7=>8);



$sql = "insert into t1 values(5,number)"; なら

|5|5|


$sql = "insert into t1 values(5,'{$bat[5]}')"; なら

|5|6|


が追加されますが

$sql = "insert into t1 values(5,'{$bat[number]}')"; だと

|5|0|


となってしまいます。これを

|5|6|

とするにはどうしたらよいのでしょうか

何卒よろしくお願いします。

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

  • 回答No.9
  • ベストアンサー

ベストアンサー率 36% (784/2137)

> $num = が5、6、7と変化し、レコードが3つ追加されるようにするにはどう
> したらよいのでしょうか。
$numが5~7に変化するという事は、$numが変化するタイミングが存在するはずです。
単に内部的に5~7に変化して、その分のレコードを登録したいというのならば、
for()文などを利用して実行する事になると思います。
$bat=array(5=>6,6=>7,7=>8);
for ($num = 5; $num <= 7; $num++) {
$sql = "insert into t1 values('" . $num . "','" . $bat[$num] . "')";
$res = mysql_db_query($db,$sql);
}
こうすることで、DB側では3つのinsert文を発行する事になります。

> t = 5
> $num = t;
> ではなぜエラーとなるのでしょうか。
これはちょっと何の事を言っているのか分かりませんでしたが、
単純に「t」がPHPの文法として正しくないからエラーとなると思います。
変数なら「$t = 5」となるはずですし、定数なら「define("t", 5)」
となるはずです。
お礼コメント
Scipio93

お礼率 21% (19/90)

すべて解決しました。
本当にありがとうございました。
これからマニュアルを全て読み、
今後はなるべく自力で解決できるよう努力しながら
プログラミングに挑戦していきます。
しかし、またお世話になることがあると思いますので
そのときはよろしくお願いいたします。
投稿日時:2008/01/30 08:12

その他の回答 (全8件)

  • 回答No.8

ベストアンサー率 36% (784/2137)

> まず t1テーブルをつくり
> create table t1 (number int(10) ,number2 int(10));
> insert into t1 values(1,2);
> insert into t1 values(3,4);
ここで分かる事は以下の1点です。
 ・「number」という名前を有して利用出来ているのはDB側であり、PHP側ではない。

> <?
> 略
> $sql = "insert into t1 (number,number2) values (5,number)";
> mysql_db_query($db,$sql);
> ?>
ここで分かるのは以下の2点です。
 ・PHP側では$sqlという変数に『ただの文字列』を設定している。
 ・PHP側ではmysql_db_query()で$sql内の『ただの文字列』を渡す事により、
  DB側へSQL文の発行を依頼している。

つまり、PHP側ではあくまでSQL文を『ただの文字列』として作って、その
『ただの文字列』をDB側へ送っているだけになります。
DB側では「number」という項目が解釈できるので、正常に動作します。
PHP側では『ただの文字列』である事を勘違いし、『ただの文字列』としてではなく
『PHPの機能』として直接DBの項目を利用しようとなどとすると、
先の回答にあるとおり、PHP側ではDB側の項目名なんて知ったこっちゃありませんし、
PHP側ではそんな定義や変数がないので、そんなのねーよ、となります。

一度PHPを介さないでDBだけで、コマンドプロンプトなどでDB操作をしてみれば分かると思いますが、
SQLを実行しようとしてキーボードから打っているのは『ただの文字列』なはずです。
キーボードの位置が、PHPを介した場合にはPHPになる、ただそれだけです。

> PHPで5という値を受け取った場合、その5という値と(1)、その
> 5に対応する($bat=array(5=>6,6=>7,7=>8);の場合なら)6という値
> (2)、の2つの値をmysqlの既存テーブルに保存する方法が結局知りた
> いのです。
$bat=array(5=>6,6=>7,7=>8);
$num = 5; //PHPで5という値を受け取った、とする
$sql = "insert into t1 values('" . $num . "','" . $bat[$num] . "')"; //number項目には$numの値が、number2項目には$bat[$num]の値が設定される

$bat[$num]は、以下のように動作しています。
 ・$bat[$num] は $bat[5] となり、 $bat[5] は 6 である。

つまり、$sqlの中身を見てみると、以下のようになります。
insert into t1 values('5','6')

仕事の関係で時間がない為ちょっと不親切な説明かもしれません・・・。
補足コメント
Scipio93

お礼率 21% (19/90)

わたしのような初心者に細かく解説いただき、本当にありがとうございました。DB側ではnumberの文字列はわかるが、'{$bat[number]}'でこられてもわからないということが、やっと理解できました。

そして、私のやりたいことですが、
$num = 5;
$bat=array(5=>6,6=>7,7=>8);
$sql = "insert into t1 values('" . $num . "','" . $bat[$num] . "')";
$res = mysql_db_query($db,$sql);
でできました。ありがとうございます。

ただ、これでは、あまりに静的です。
$num = が5、6、7と変化し、レコードが3つ追加されるようにするにはどうしたらよいのでしょうか。
また上記で
t = 5
$num = t;
ではなぜエラーとなるのでしょうか。
再度ご教授の程、何卒よろしくお願いいたします。
投稿日時:2008/01/29 22:42
  • 回答No.7

ベストアンサー率 36% (784/2137)

> しかし、今回の場合 PHPから
> $sql = "insert into t1 values(5,number)"; で
> |5|5| となったのですが、
> これはどうしてなのでしょうか(もちろん5を定義はしていません)
5は数値です。numberはテーブルの項目名です。
上記文字列をSQL文としたらこうなります。
insert into t1 values(5,number)

これをDB上で発行すれば、DBはテーブル項目のnumberを理解できるので処理されます。
mysql_query(だったかな?)などをした時点で、先に述べたSQL文は
PHPではなくDBで処理されます。
PHPはあくまでDBで発行する為のSQL文を『文字列』として作っているだけです。

> また、$sql = "insert into t1 values(■,'{$bat[■]}')"; で
> 配列を参照してもらう方法はないでしょうか
これは何がしたいのか不明ですが、複数レコードを一気に登録したい、という事ならば、
複数レコード分のSQL文の生成とSQL文の発行を行う必要があります。
for()文などを利用してそれらを実現します。
検討違いならすみません。。。
補足コメント
Scipio93

お礼率 21% (19/90)

すみません、まだどうしても理解できません。

まず t1テーブルをつくり
create table t1 (number int(10) ,number2 int(10));
insert into t1 values(1,2);
insert into t1 values(3,4);

<?

$sql = "insert into t1 (number,number2) values (5,number)";
mysql_db_query($db,$sql);
?>
でPHPから命令したら
t1テーブルのnumber、number2のどちらにも5が入ります。
values (10,number)";なら、どちらにも10が入りました。

「テーブルレイアウト上の名前をPHPに対して唱えてもPHPは理解してくれません。(inu2様)」なら、こうはならないのではと、初心者ゆえ考えてしまうのですが、何卒御教授下さい。


> また、$sql = "insert into t1 values(■,'{$bat[■]}')"; で
> 配列を参照してもらう方法はないでしょうか

については、PHPで5という値を受け取った場合、その5という値と(1)、その5に対応する($bat=array(5=>6,6=>7,7=>8);の場合なら)6という値(2)、の2つの値をmysqlの既存テーブルに保存する方法が結局知りたいのです。
何卒よろしくお願い致します。
投稿日時:2008/01/29 18:22
  • 回答No.6

ベストアンサー率 33% (1229/3720)

テーブルレイアウトの number はPHPでは全くもって意味の無い名前です
PHPはSQL文を理解しているわけではありません。
つまり、テーブルレイアウト上の名前をPHPに対して唱えてもPHPは理解してくれません。


上記の質問の内容では
$bat[number]
としても PHPは理解できません

$bat=array(5=>6,6=>7,7=>8);
と定義している以上、$batに入っているのは、3つです
つまり
$bat[5]
$bat[6]
$bat[7]
の三種類しか格納されていませんので
$bat[number] と指定されても、PHPは「なんのこっちゃ、こんなもん定義されてないよ」という意味で 何も返していません。
ですから、実際に生成されるSQL文が

insert into t1 values(5,'{$bat[number]}')
これをPHPが理解して生成すると
insert into t1 values(5,'')
となりますので、MySQLはこのINSERTを理解して
numberのカラムには 5を
number2のカラムがNOT NULL DEFAULT 0 などの設定になっているのであれば、MySQLは勝手に 0 を入れているだけです



$num = 5;
$sql = "insert into t1 values(".$num .",'".$bat[$num]."')";
こうしたり、

$bat=array(5=>6,6=>7,7=>8,'number'=>6);
と定義して
$sql = "insert into t1 values(5,'".$bat['number']."')";
と書けば,、PHPが理解して生成されるSQL文が
insert into t1 values(5,'6')
となります。



PHPをはじめとする、他の言語でも同様ですが、各言語はデータベースやテーブルレイアウト、SQL文を各言語が理解してくれているわけではありません。
あくまでも各言語からデータベースでアクセスできるというだけです
PHPからしてみれば、SQL文は単なる文字列であり、SQL文という認識はありません。
そうやって 文字列として作られたSQL文をデータベースにQueryすることで、データベースがSQLを理解してくれて動作しています。
補足コメント
Scipio93

お礼率 21% (19/90)

大変ご丁寧に教えていただきありがとうございました。
基本的なことはよくわかりました。

しかし、今回の場合 PHPから
$sql = "insert into t1 values(5,number)"; で
|5|5| となったのですが、
これはどうしてなのでしょうか(もちろん5を定義はしていません)

また、$sql = "insert into t1 values(■,'{$bat[■]}')"; で
配列を参照してもらう方法はないでしょうか

よろしくお願いします。
投稿日時:2008/01/29 16:36
  • 回答No.5

ベストアンサー率 54% (132/242)

突っ込み返しで恐縮ですが^^;;;

$sql = "insert into t1 values('{$num}','{$bat[${num}]}')";
これだとNotice出ますな。
Notice: Use of undefined constant num - assumed 'num' in ....

どうしても{}使いたいのであれば
$sql = "insert into t1 values('{$num}','{$bat[$num]}')";
とせねばなりません。ですがこれだと
phpパース→メモリ上に展開された文字列データを解析→再度phpパース→メモリ上に展開された文字列データを破棄→新たに展開
となるので非常ーーーに効率が悪いです。
普通はやりません^^;
補足コメント
Scipio93

お礼率 21% (19/90)

すみません
最初のテーブル部分を略していました
以下が正しいものです

t1
+-+-+
|number|number2|
+-+-+
|1|2|
+-+-+
|3|4|

何卒よろしくお願いします。
投稿日時:2008/01/29 14:18
  • 回答No.4

ベストアンサー率 51% (3827/7415)

残念ながら#1さんの回答の
$sql = "insert into t1 values(5,'" . $bat["number"] . "')";
は本件に関しては無意味です

もしやるなら
$bat=array(5=>6,6=>7,7=>8);
$num=5;
$sql = "insert into t1 values('{$num}','{$bat[${num}]}')";
ですね。
補足コメント
Scipio93

お礼率 21% (19/90)

すみません
最初のテーブル部分を略していました
以下が正しいものです

t1
+-+-+
|number|number2|
+-+-+
|1|2|
+-+-+
|3|4|

何卒よろしくお願いします。
投稿日時:2008/01/29 14:25
  • 回答No.3

ベストアンサー率 36% (784/2137)

numberという定数はPHPのどこで定義されているのでしょう?
定義されていないならそういった結果になるのは当然です。
$bat内には、連想配列である$bat["number"]も存在しませんし、
numberが定数であったとしたらnumberの定数定義が存在しません。

numberがテーブル項目名を指すならば、DBとPHPを切り分けて考えましょう。
PHPの構文内でDBの項目名などは利用出来ません。
numberに設定したい値(ここで5)を変数などで使いまわせば可能です。
$bat=array(5=>6,6=>7,7=>8);
$num = 5;
$sql = "insert into t1 values('" . $num . "','" . $bat[$num] . "')";
補足コメント
Scipio93

お礼率 21% (19/90)

すみません
最初のテーブル部分を略していました
以下が正しいものです

t1
+-+-+
|number|number2|
+-+-+
|1|2|
+-+-+
|3|4|

何卒よろしくお願いします。
投稿日時:2008/01/29 14:26
  • 回答No.2

ベストアンサー率 54% (132/242)

脊髄反射で書いちゃったけど質問の意図を完全に理解してなかったかもしれない。


$sql = "insert into t1 values(5,'" . $bat["number"] . "')";



$sql = "insert into t1 values(5,'" . $bat[5] . "')";
$sql = "insert into t1 values(5,'" . $bat[6] . "')";

こういうことですかね。
numberだと定数が宣言されてないのでnoticeが出ますな。
$numberのtypoだとすると

$number = 5;
$sql = "insert into t1 values(5,'" . $bat[$number] . "')";

こういうことですかね。
numberが定数なら

define('number',5);
$sql = "insert into t1 values(5,'" . $bat[number] . "')";

こうなりますな。
  • 回答No.1

ベストアンサー率 54% (132/242)

>$sql = "insert into t1 values(5,'{$bat[number]}')";
$sql = "insert into t1 values(5,'" . $bat["number"] . "')";
としましょう。{}は便利ですが遅い上に質問者様提起のようなバグの原因となります。
// 仕事のコードでこれ書いた奴は殴ります。

変な動作をしたらクエリを標準出力に出すと原因が分かりやすくなります。
echo $sql;

質問者様の場合はコードを書く前にマニュアル全てをあと42回読むことをお勧めしますよ。

まにゅある 文字列演算子
http://jp.php.net/manual/ja/language.operators.string.php
結果を報告する
このQ&Aにはまだコメントがありません。
あなたの思ったこと、知っていることをここにコメントしてみましょう。
関連するQ&A

その他の関連するQ&Aをキーワードで探す

ピックアップ

ページ先頭へ