またお世話になります。
PHPからMySQLへデータをインサートしたいのですが、各サイトを参考にしながら試しているのですがどうにも上手くいきません。
ソースを見ていただけますでしょうか?

$con = mysql_connect("localhost","user","password")
or die("MySQLに接続できません。");

mysql_select_db('test');
$sql = "SET CHARACTER SET UTF8";
$result = mysql_query($sql);

$data1 = $HTTP_POST_VARS["inpdata1"];
$data2 = $HTTP_POST_VARS["inpdata2"];
$data3 = $HTTP_POST_VARS["inpdata3"];

$sql = 'INSERT INTO `tab1` (`abc`, `def`, `ghi`) VALUES (`$data1`,`$data2`,`$data3`);';
$result = mysql_query($sql);

print $data1; //ここでは通常にデータが表示されるので
print $data2; //データの受け渡しは問題ないはずですが。
print $data3;

mysql_free_result($result);
mysql_close($con);

このQ&Aに関連する最新のQ&A

A 回答 (2件)

$result = mysql_query($sql) or die(mysql_error());



としてデバッグしてみるといいですよ。

×$sql = 'INSERT INTO `tab1` (`abc`, `def`, `ghi`) VALUES (`$data1`,`$data2`,`$data3`);';
○$sql = "INSERT INTO `tab1` (`abc`, `def`, `ghi`) VALUES ('$data1','$data2','$data3')";

単純に、valuesの中で渡すデータはバッククォーテーションではなく
シングルクォーテーションです。フィールド名ではなくデータを
わたしたいのですから・・・。
$sql変数に代入する場合のくくりはダブルクォーテーションですね。
(変数を参照するため)

それと念のため、sqlのケツのセミコロンは取っておいた方がよいです。
    • good
    • 0
この回答へのお礼

環境も書かない(書き忘れた)失礼な質問に親切なお礼、ありがとうございます。
無事上手くいきました。

ただ
>それと念のため、sqlのケツのセミコロンは取っておいた方がよいです。

このケツのセミコロンはないとエラーになってしまいました。
付けてあって正解のようです。

ところでこのような質問はMySQL側でよろしいのでしょうか?
PHP側で質問するべきでしょうか?
この回答だけ頂いたら回答を締め切らせていただこうと思います。

お礼日時:2007/03/29 14:18

うーん、どっちなんでしょうね・・・


ま、マルチポストさえしなければどっちでもいいんじゃないですか?
私は両方ともこまめに見てますので、どちらでも
フォローできると思いますよ。

>ケツのセミコロン
説明不足ですみませんが、ケツのセミコロンとはSQL分のセミコロン
のことを言いたかったのです。
場合によってはこれをつけるとエラーになることがあります。

もちろんほんとのケツのセミコロンはPHPの文法上の区切り文字
なので必須です。
    • good
    • 0
この回答へのお礼

セミコロン、また私が勘違いしていたようですね。
理解できました、ありがとうございます。

マルチポストは確かにまずいですね。
今後も一連の質問は、とりあえずこちらのほうにさせていただこうと思います。

非常に簡単なものですが、なんとか作成しているデータベースも型になってきました。
同時にMySQLとPHPも少し分かってきたような気がします。
今後もぜひご指導お願いします。

お礼日時:2007/03/30 11:40

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

関連するカテゴリからQ&Aを探す

このQ&Aと関連する良く見られている質問

QPDOのバインドをforeachでまとめて処理したいができません…。

いつもお世話になっております。
PHP5.2.5
---------------------------
DB(フィールドは以下3項目)
・id(primary key)
・color
・num
---------------------------

//DBにインサートするデータ群(配列に格納してある)
$insert_array = array('color'=>'red','num'=>6);

//==================================================
// *フィールド名とそれに対応するデータをバインドする。
//==================================================

//==================================================
// *バインド:方法1
//==================================================

foreach($insert_array as $field => $value){

 //確認処理
 //echo $field.'<br/>';
 //echo $value.'<br/>';

 //バインド(foreachで、1つずつバインドしていく)
 $stmt->bindParam(':'.$field,$value);

}

//==================================================
// *バインド:方法2(↓こちらだと上手くいく。)
//==================================================

/*
$stmt->bindParam(':'.'color',$insert_array['color']);
$stmt->bindParam(':'.'num',$insert_array['num']);
*/


//==================================================
// *バインド後、「$stmt->execute();」した結果
// *DBにインサートされたものをprint_r()にて確認
//==================================================

★方法1

Array
(
[id] => 15
[color] => 6
[num] => 6
)

//---------------------------
★方法2

Array
(
[id] => 16
[color] => red
[num] => 6
)

//---------------------------

★方法1の結果の、「 [color] => 6」って一体…?!

方法2のように、同じバインド処理を手書きで繰り返す分にはうまくいくのですが、
方法1のようなforeachでまとめて処理するやり方だとうまくいきません。
方法1の問題箇所をどなたか教えて下さい。
宜しくお願い致します。

いつもお世話になっております。
PHP5.2.5
---------------------------
DB(フィールドは以下3項目)
・id(primary key)
・color
・num
---------------------------

//DBにインサートするデータ群(配列に格納してある)
$insert_array = array('color'=>'red','num'=>6);

//==================================================
// *フィールド名とそれに対応するデータをバインドする。
//==================================================

//=====================================...続きを読む

Aベストアンサー

bindParamでバインドされるのは変数の値ではなく変数です。また、マニュアルから引用すると
「変数は参照としてバインドされ、PDOStatement::execute() がコールされたときのみ評価されます。」
なので、foreach内での
>$stmt->bindParam(':'.$field,$value);
は、言ってみれば$valueの位置を記憶しているにすぎません。
で、execute実行時に初めて中身の値を取りに行き、そこに入っているもの(要するにforeachの最後の値)をセットしてしまっています。

参考URL:http://www.php.net/manual/ja/pdostatement.bindparam.php

Qmysql_close をすれば mysql_free_result は必要ありませんか?

mysql_close と mysql_free_result の使い方がよく分かりません。

mysql_close でデータベースとのコネクションを切断すれば、mysql_free_resultする必要がないように思うのですが・・・

クエリで使用したメモリの解放は必ずした方が良いのでしょうか?

また、mysql_close と mysql_free_result をすることによってMySQLサーバーへの負担は軽減されるのでしょうか?

Aベストアンサー

きちんとしたプログラムを心がけるなら
開いたら閉じる、いらなくなったらすてるというのが基本ですね。

>必ずした方が良いのでしょうか?

と聞かれたら「はい」というのが正解でしょうね。
ただ、実際問題みんなそうしているかというと、手間だから
省いている人も多いでしょう。だからといって、しなくていい
というわけではありません。

Qテーブルの一部の内容をまとめて、別テーブル上に更新したい

テーブル(tA)のカラム(cA cB)を入れ替えたいと思っています。
(全カラムではなく、一部分だけの入れ替えです。)

そこで、一時テーブルを作成し、
 元テーブル→一時テーブル(入れ替え部分だけ)→元テーブル
で対象となるカラムを入れ替えようと思いました。

一時テーブルに、カラムを入れ込むまでは出来たのですが、一時テーブルから、元のテーブルに入れ込むSQLがどうしてもわからず、教えていただきたく書き込みました。

行ったSQLとしては、

1)INSERT INTO TEMP(Id,Date,cA,cB) SELECT Id,Date,cA,cB FROM tA WHERE Id=XXXX;

2)UPDATE tA SET cA=(SELECT cA FROM TEMP WHERE Id=XXXX AND tA.Date = TEMP.Date ) WHERE Id=XXXX;

といった形で試してみました。

ご教授、宜しくお願いします。

Aベストアンサー

さっきのだと、1行ずつしか変更できないんで、相関サブクエリーを使った方がいいでしょう。

UPDATE tA SET cA = (SELECT cB FROM temptable WHERE id = tA.id),
SET cB = (SELECT cA FROM temptable WHERE id = tA.id)
WHERE 任意の抽出条件;

Qmysql_real_escape_string()の簡単な構文

mysql_real_escape_string()関数について2つほど質問があります。
1.この関数はSQLとして書くものですか?それともプログラムとして書くものですか?
2.公式サイトの例がよく理解できないので、簡単な構文を教えていただけないでしょうか?

初心者的な質問ですが、よろしくお願いします。

Aベストアンサー

>1.この関数はSQLとして書くものですか?それともプログラムとして書くものですか?

PHPの関数ですからプログラムとして書くものですね。

>2.公式サイトの例がよく理解できないので、簡単な構文を教えていただけないでしょうか?

$hoge= mysql_real_escape_string(trim($_REQUEST['hoge']));
などgetやpostで受けたデータをエスケープします。

QOutlook Expressまとめて保存

Outlook Expressの中のメールをまとめて保存したいのですが。

一つづつ 保存先に移動するのではなく まとめて移動したいのですが
そのまとめ方のやり方が分かりません。

何か方法あるのでしょうか 教えてください。

Aベストアンサー

 まず、新規のパソコンに今までのメールを移動したい場合。
 受信トレイを右クリック→プロバティを選択すると、保存場所がかかれて
います。この保存フォルダに大抵、送信トレイやゴミ箱といったフォルダも
ありますので、このフォルダを保存すればよいでしょう。
 新規のパソコンに移動したい場合は、新規のOEで保存場所を確認し、その場所に
先程バックアップしたフォルダを移動させれば終了です。

 次に、単純にメールをまとめて保存したい場合。
私はこれを使用しています→「RenEml」
(フリーソフト・Win98、Me用)

参考URL:http://www.vector.co.jp/soft/win95/net/se202206.html

Qmysql_close();の必要性について

初心者です、よろしくお願いします。

参考書などの参考ソースを見ていると必ずページの最後や
クエリーを投げた終わりにmysql_close();を使ってmysqlを切断??しているのですが、これは必要なのでしょうか?

初心者ながら、ページは上から読み込まれるのでページのロードが完了した時点で接続が切れると思うのでが・・・

ご存知の方がいましたら是非教えてください。
よろしくお願い致します。

Aベストアンサー

>初心者ながら、ページは上から読み込まれるのでページのロードが完了した時点で接続が切れると思うのでが・・・

ここで切れるのは、クライアント(ブラウザ)とWebアプリケーションとの接続です。WebアプリケーションからDBへの接続とは別です。

ただし、http://jp.php.net/manual/ja/function.mysql-close.php に書いてあるように、PHPなどの言語では、Webアプリケーションの実行終了時に、WebアプリケーションからDBへの接続は自動的に切断されます。なので、これらの言語では、プログラマーがプログラム中にmysql_closeと必ず書かなければならない訳ではありません。

ですが、mysql_closeで接続を切断するのは、一般的に良い習慣だとされています。というのは、DBへの接続は限られた貴重な資源だからです。Webアプリケーションの実行終了を待たずに、不要になった時点で速やかにmysql_closeでDB接続を切断してやれば、DBへの接続を必要としている他のアプリケーションが、より早くそのDB接続を使用できるようになります。

例えが適切か判りませんが、うちのテレビは一定時間操作しないと自動的に電源が切れるようになっています。ですが、自動的に切れるからといって、テレビをつけっ放しにしておくことは無い訳です(そんなことをしたら家族に怒られます)。

>初心者ながら、ページは上から読み込まれるのでページのロードが完了した時点で接続が切れると思うのでが・・・

ここで切れるのは、クライアント(ブラウザ)とWebアプリケーションとの接続です。WebアプリケーションからDBへの接続とは別です。

ただし、http://jp.php.net/manual/ja/function.mysql-close.php に書いてあるように、PHPなどの言語では、Webアプリケーションの実行終了時に、WebアプリケーションからDBへの接続は自動的に切断されます。なので、これらの言語では、プログラマーがプログラ...続きを読む

Qテキストファイルの中身をまとめて削除したい

テキストファイルの中身をまとめて削除したいのですが
例えばa01.txtからz01.txtまである場合
fopen'w'でまとめて削除する場合、どう記述するのでしょうか?

ご教示お願い致します。

Aベストアンサー

ごく普通にループさせます。

foreach (range('a', 'z') as $alpha) {
fclose(fopen("{$alpha}01.txt", 'w'));
}

なお、同時アクセスを考慮してファイルロックを行う場合は

foreach (range('a', 'z') as $alpha) {
$fp = fopen("{$alpha}01.txt", 'a');
flock($fp, LOCK_EX);
ftruncate($fp, 0);
flock($fp, LOCK_UN);
fclose($fp);
}

と書きましょう。

ちなみにfcloseは書く人が多いので "何となく" 書いていますが、書かなくても勝手にメモリ解放されるので必ずしも必要ではありません。C言語の場合は書かない場合「プログラム終了時」に解放される仕様となっているので書く方が望ましいのですが、PHPの場合は変数のガベージコレクションと同時にリソースのガベージコレクションも行われるので不要です。

Qmysql_real_escape_string

独学数ヶ月の初心者の質問で恐縮です。

もろもろの事情で仕方なくmysql_real_escape_stringを
以下(1)のように使用しなくてはならないと仮定し、
セキュリテイの面で(2)のようにシングルクオテーションつける
事で危険を回避できますか?

またシングルクオテーションは(2)のようにつけてはいけない
とかありますか?(記述の基本が曖昧なため、ただの確認の質問)

(1)
$sql = sprintf("SELECT id , password FROM `adminDatabase` where id = '%s' and password = '%s' order by id",
mysql_real_escape_string($id),
mysql_real_escape_string($password));

(2)
$sql = sprintf("SELECT id , password FROM `adminDatabase` where id = '%s' and password = '%s' order by id",
’mysql_real_escape_string($id)’,
’mysql_real_escape_string($password)’);


よろしくお願いします。

独学数ヶ月の初心者の質問で恐縮です。

もろもろの事情で仕方なくmysql_real_escape_stringを
以下(1)のように使用しなくてはならないと仮定し、
セキュリテイの面で(2)のようにシングルクオテーションつける
事で危険を回避できますか?

またシングルクオテーションは(2)のようにつけてはいけない
とかありますか?(記述の基本が曖昧なため、ただの確認の質問)

(1)
$sql = sprintf("SELECT id , password FROM `adminDatabase` where id = '%s' and password = '%s' order by id",
mysql_real_escape_string...続きを読む

Aベストアンサー

まずmysql_real_escape_string自体がmysql系の古い関数なので非推奨です。
独学で学習されているのでしたら、参考にしている書籍やサイトを新しいものに変えてください。
最低でもmysqli系の処理に置き換えてください。

また$idや$passwordなど管理側が仕様を指定できるものは
・m文字以上でn文字以下であること
・構成文字が英数字のみに限られること
などをチェックして、そうでない場合はエラーを返すような仕様にしておけば
あえてエスケープする必要はありません

任意の文字列を利用して検索をかけたりするような場合はPDOを利用し、
プリペアドステートメントで処理するのが妥当だといわれています。

Qスキル上げはまとめて?

素材はまとめて合成派?

1体ずつでも合成する派?

Aベストアンサー

どちらも期待値は同じと信じたいですが、万が一成功確率が変動するなら、まとめて合成した場合に下がると思います。高速周回している廃課金者はまとめて合成が多いので。
なので自分は一体づつでも合成してます。

QPHP+MySQLでCall to undefined function mysql_connect()

PHP5.0.14
MySQL5.0.22

http://allabout.co.jp/computer/database/closeup/CU20060414A/index.htm
上記のサイトを見て

$dbHandle = mysql_connect("localhost","root","root")
or die("can not connect db\n");

を実行したところ、タイトルのようなエラーが出ました。

php.iniでextension=php_mysql.dllも書かれていて、
php_mysql.dllもphp/extに入っています。

phpinfo()で見ると、MySQLらしき部分がありません。
どうすれば実行できるのでしょうか?

Aベストアンサー

WindowsOSの環境変数のPATHに、
phpのディレクトリを設定してみてください。
libmysql.dllが、PATHでサーチできないとそうなるようです。
(よくlibmysql.dllを、Windowsのシステムフォルダにコピーする手が紹介されていたりしますが、phpにPATHを通すやり方が正統派と思います。)


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング