その配列を 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」が追加されるのか分かる方がいましたら教えてください。
一日中悩んでおりますのでよろしくお願いします。
実行する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";
}
とでも直したらどうでしょう?
>配列内には「0」がないのに・・・。
実際に入るところをみると foreach ($persons as $person) { で
取得されるようですね。
たぶん 配列は 0から使用されるので たとえ 0に何もセットされてなくても
領域は 確保されているから 0から 取得できるということですね。
0の時は 何もしないように if文でも入れたらいいですね。
と思ったけど tdoiさんの回答をみると データが 0の配列が あったから なんですねぇ。
[3] => [4] => [5] =>
これが 0の原因ですか。
二回もご回答していただきありがとうございます。
参考にさせていただきます。
実行する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”で出力すると中身が見れるんですね。
大変参考になりました。
この方法を検証させていただきます。
ご回答ありがとうございます。
2012/01/30 12:08:33SQL文を”echo”で出力すると中身が見れるんですね。
大変参考になりました。
この方法を検証させていただきます。