人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

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 1D・J・カルーソー
2 1シャイア・ラブーフ
3 1ミシェル・モナハン
配列内には「0」がないのに・・・。
なぜ「0」が追加されるのか分かる方がいましたら教えてください。
一日中悩んでおりますのでよろしくお願いします。

●質問者: ぱんたま
●カテゴリ:ウェブ制作
○ 状態 :終了
└ 回答数 : 2/2件

▽最新の回答へ

1 ● きゃづみぃ

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

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

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

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


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

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

これが 0の原因ですか。


ぱんたまさんのコメント
二回もご回答していただきありがとうございます。 参考にさせていただきます。

2 ● tdoi
ベストアンサー

実行する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";
}

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


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

●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ