PHPのforeachでテーブルにデータを追加した際に、配列にはない「0」が追加されてしまう。

その配列を foreach文を使ってテーブルにinsertする以下のコードを書きました。

foreach ($persons as $person) {
$sql = "insert into m_person (person_id,title_id,per_name)
VALUES ('" . mysql_real_escape_string($person["id"]) . "','"
. mysql_real_escape_string($title_id) . "','"
. mysql_real_escape_string($person["name"]) . "')";
$result=mysql_query($sql) or die(mysql_error() .'aaa');
}

$personsには、
Array ( [0] => Array ( [id] => 1 [name] => D・J・カルーソー ) [1] => Array ( [id] => 2 [name] => シャイア・ラブーフ ) [2] => Array ( [id] => 3 [name] => ミシェル・モナハン ) [3] => [4] => [5] => )
が入っています。

insert処理をするとperson_idになぜか「0」が追加されます。
person_id 、title_id、person_name
0      1
1      1 D・J・カルーソー
2      1 シャイア・ラブーフ
3      1 ミシェル・モナハン
配列内には「0」がないのに・・・。
なぜ「0」が追加されるのか分かる方がいましたら教えてください。
一日中悩んでおりますのでよろしくお願いします。

回答の条件
  • 1人10回まで
  • 登録:
  • 終了:2012/01/31 23:40:10

ベストアンサー

id:tdoi No.2

回答回数174ベストアンサー獲得回数75

実行するSQLを出力してみれば分かるかなと。

質問文と同等のコードを作ると、こうなります。
mysql_queryの代わりにechoで出力させています。

$persons = array(array('id' => 1, 'name' => 'D・J・カルーソー'),
		 array('id' => 2, 'name' => 'シャイア・ラブーフ'),
		 array('id' => 3, 'name' => 'ミシェル・モナハン'),
		 '',
		 '',
		 '',);
$title_id = 1;
foreach ($persons as $person) {
  $sql = "insert into m_person (person_id,title_id,per_name) VALUES ('"
    . mysql_real_escape_string($person["id"]) . "','"
    . mysql_real_escape_string($title_id) . "','"
    . mysql_real_escape_string($person["name"]) . "')";
  echo $sql . "\r\n";
}

僕の環境では、次のような出力が得られます。

insert into m_person (person_id,title_id,per_name) VALUES ('1','1','D・J・カルーソー')
insert into m_person (person_id,title_id,per_name) VALUES ('2','1','シャイア・ラブーフ')
insert into m_person (person_id,title_id,per_name) VALUES ('3','1','ミシェル・モナハン')
insert into m_person (person_id,title_id,per_name) VALUES ('','1','')
insert into m_person (person_id,title_id,per_name) VALUES ('','1','')
insert into m_person (person_id,title_id,per_name) VALUES ('','1','')
PHP Notice:  Uninitialized string offset: 0 in C:\Users\takuo\work\toybox\test.php on line 14
PHP Notice:  Uninitialized string offset: 0 in C:\Users\takuo\work\toybox\test.php on line 16
PHP Notice:  Uninitialized string offset: 0 in C:\Users\takuo\work\toybox\test.php on line 14
PHP Notice:  Uninitialized string offset: 0 in C:\Users\takuo\work\toybox\test.php on line 16
PHP Notice:  Uninitialized string offset: 0 in C:\Users\takuo\work\toybox\test.php on line 14
PHP Notice:  Uninitialized string offset: 0 in C:\Users\takuo\work\toybox\test.php on line 16

後半のNoticeも気になりますが、まずは、SQLクエリを確認します。
最初の3つは意図通りですね。では、その後の3つは?

insert into m_person (person_id,title_id,per_name) VALUES ('','1','')
insert into m_person (person_id,title_id,per_name) VALUES ('','1','')
insert into m_person (person_id,title_id,per_name) VALUES ('','1','')

作成されているDBスキーマが分からないので絶対とは言えないですが、こいつが該当のデータを挿入しているのではないかなと。

foreach ($persons as $person) {
  if (empty($person) || !is_array($person)) {
    continue;
  }
  $sql = "insert into m_person (person_id,title_id,per_name) VALUES ('"
    . mysql_real_escape_string($person["id"]) . "','"
    . mysql_real_escape_string($title_id) . "','"
    . mysql_real_escape_string($person["name"]) . "')";
  echo $sql . "\r\n";
}

とでも直したらどうでしょう?

id:kyouryukun

ご回答ありがとうございます。
SQL文を”echo”で出力すると中身が見れるんですね。
大変参考になりました。
この方法を検証させていただきます。

2012/01/30 12:08:33

その他の回答1件)

id:taknt No.1

回答回数13539ベストアンサー獲得回数1198

>配列内には「0」がないのに・・・。

実際に入るところをみると foreach ($persons as $person) { で
取得されるようですね。

たぶん 配列は 0から使用されるので たとえ 0に何もセットされてなくても
領域は 確保されているから 0から 取得できるということですね。

0の時は 何もしないように if文でも入れたらいいですね。


と思ったけど tdoiさんの回答をみると データが 0の配列が あったから なんですねぇ。

[3] => [4] => [5] =>

これが 0の原因ですか。

id:kyouryukun

二回もご回答していただきありがとうございます。
参考にさせていただきます。

2012/01/30 12:07:54
id:tdoi No.2

回答回数174ベストアンサー獲得回数75ここでベストアンサー

実行するSQLを出力してみれば分かるかなと。

質問文と同等のコードを作ると、こうなります。
mysql_queryの代わりにechoで出力させています。

$persons = array(array('id' => 1, 'name' => 'D・J・カルーソー'),
		 array('id' => 2, 'name' => 'シャイア・ラブーフ'),
		 array('id' => 3, 'name' => 'ミシェル・モナハン'),
		 '',
		 '',
		 '',);
$title_id = 1;
foreach ($persons as $person) {
  $sql = "insert into m_person (person_id,title_id,per_name) VALUES ('"
    . mysql_real_escape_string($person["id"]) . "','"
    . mysql_real_escape_string($title_id) . "','"
    . mysql_real_escape_string($person["name"]) . "')";
  echo $sql . "\r\n";
}

僕の環境では、次のような出力が得られます。

insert into m_person (person_id,title_id,per_name) VALUES ('1','1','D・J・カルーソー')
insert into m_person (person_id,title_id,per_name) VALUES ('2','1','シャイア・ラブーフ')
insert into m_person (person_id,title_id,per_name) VALUES ('3','1','ミシェル・モナハン')
insert into m_person (person_id,title_id,per_name) VALUES ('','1','')
insert into m_person (person_id,title_id,per_name) VALUES ('','1','')
insert into m_person (person_id,title_id,per_name) VALUES ('','1','')
PHP Notice:  Uninitialized string offset: 0 in C:\Users\takuo\work\toybox\test.php on line 14
PHP Notice:  Uninitialized string offset: 0 in C:\Users\takuo\work\toybox\test.php on line 16
PHP Notice:  Uninitialized string offset: 0 in C:\Users\takuo\work\toybox\test.php on line 14
PHP Notice:  Uninitialized string offset: 0 in C:\Users\takuo\work\toybox\test.php on line 16
PHP Notice:  Uninitialized string offset: 0 in C:\Users\takuo\work\toybox\test.php on line 14
PHP Notice:  Uninitialized string offset: 0 in C:\Users\takuo\work\toybox\test.php on line 16

後半のNoticeも気になりますが、まずは、SQLクエリを確認します。
最初の3つは意図通りですね。では、その後の3つは?

insert into m_person (person_id,title_id,per_name) VALUES ('','1','')
insert into m_person (person_id,title_id,per_name) VALUES ('','1','')
insert into m_person (person_id,title_id,per_name) VALUES ('','1','')

作成されているDBスキーマが分からないので絶対とは言えないですが、こいつが該当のデータを挿入しているのではないかなと。

foreach ($persons as $person) {
  if (empty($person) || !is_array($person)) {
    continue;
  }
  $sql = "insert into m_person (person_id,title_id,per_name) VALUES ('"
    . mysql_real_escape_string($person["id"]) . "','"
    . mysql_real_escape_string($title_id) . "','"
    . mysql_real_escape_string($person["name"]) . "')";
  echo $sql . "\r\n";
}

とでも直したらどうでしょう?

id:kyouryukun

ご回答ありがとうございます。
SQL文を”echo”で出力すると中身が見れるんですね。
大変参考になりました。
この方法を検証させていただきます。

2012/01/30 12:08:33

コメントはまだありません

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

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

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

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