現在2つのデータベース間でのデータ処理をしています。
例えば下記の様な2つのデータベースがあります。
★データベース1
テーブル名:TEST1
項目:JOUTAI, KANRI_NO
DBに接続するには
$db_Handle = mysql_connect("aaaaa","bbbb","cccc");
mysql_select_db("dddd");
の命令を使います。
★データベース2
テーブル名:TEST2
項目:KANRI_NO ,KAZU
DBに接続するには
$db_Handle = mysql_connect("eeeee","ffff","gggg");
mysql_select_db("hhhh");
の命令を使います。
この二つのデータベース間で処理をしたいと考えています。
今回お聞きしたいことですが
テーブル TEST1 のJOUTAIパラメータが'1'になっているものの管理番号を抜き出し、テーブル TEST2に同じ管理番号があれば項目KAZUに入っている数字に+1を加えるという処理をしたいと考えています。
自分でスクリプトを組んでみたのですがうまくいきませんでした。
お手数をおかけしますが、もしわかるかたおりましたらスクリプトを見ていただければと考えています。
どうぞよろしくお願いします。
(見直し点1)コネクトは1回
mysql_connect をループ内で毎回行うと、ループした数だけデータベースへの道が作られ、
それぞれ独立したものとして維持管理される事となり、非常に無駄です。
ループ前に1回だけ行うようにします。
(見直し点2)データベースのハンドル名は分ける
ハンドル名が同じだと、後からのものだけが有効となってしまいます。
$db_Handle1 = mysql_connect("aaaaa","bbbb","cccc");
$db_Handle2 = mysql_connect("eeeee","ffff","gggg");
(見直し点3)mysql_select_db、や mysql_query などは省略形にしない。
省略すると「直前の接続だけを使う」事になってしまいますので、
複数同時接続の場合は基本的に省略できません。
$db1 = mysql_select_db("dddd", $db_Handle1);
$abc = mysql_query("SELECT * FROM TEST1 WHERE JOUTAI='1' ", $db_Handle1);
$db2 = mysql_select_db("hhhh", $db_Handle2);
$def = mysql_query("SELECT * FROM TEST2 WHERE KANRI_NO=".$kanri_no." ", $db_Handle2);
mysql_query("UPDATE TEST2 SET KAZU=".$zaiko." WHERE KANRI_NO=".$kanri_no." ", $db_Handle2);
(見直し点4)確認点がない。
接続に成功したかどうかなど、必要な確認を入れていないので、
どこでトラぶっているかの判別が非常に難しくなる。
見直し点はまだまだあり、とてもじゃないけど短文では言い表せないので、
とりあえず大きな点だけあげました。
以下、動作確認までは行っていませんが、極力、元のコードの形をとどめて、
書いてみましたので適宜確認しながら適用していってください。
$db_Handle1 = mysql_connect("aaaaa","bbbb","cccc"); if (!$db_Handle1) { echo "データベース1への接続に失敗"; exit; # 失敗なので、ここで終了 } $db1 = mysql_select_db("dddd", $db_Handle1); $abc = mysql_query("SELECT * FROM TEST1 WHERE JOUTAI='1'", $db_Handle1); $abc_count = mysql_num_rows($abc); if (!$abc_count) { echo "該当するデータは見つかりませんでした。"; exit; # 書き換えるべきデータは無いので、ここで終了 } $db_Handle2 = mysql_connect("eeeee","ffff","gggg"); if (!$db_Handle2) { echo "データベース2への接続に失敗"; exit; # 失敗なので、ここで終了 } $db2 = mysql_select_db("hhhh", $db_Handle2); while ($row = mysql_fetch_array($abc, MYSQL_ASSOC)) { $kanri_no = $row["KANRI_NO"]; $def = mysql_query("SELECT * FROM TEST2 WHERE KANRI_NO=" . $kanri_no, $db_Handle2); while ($row = mysql_fetch_array($def, MYSQL_ASSOC)) { $zaiko = $row["KAZU"]; $zaiko++; $u = mysql_query("UPDATE TEST2 SET KAZU=" . $zaiko . " WHERE KANRI_NO=" . $kanri_no, $db_Handle2); } }
※UPDATEに成功したかどうか、何件処理したかについては下記コマンドを参照ください。
未確認ですがこちらでいかがでしょうか?
//まずデータベース1で処理するのでデータベース1にアクセスします。 $db_Handle1 = mysql_connect("aaaaa","bbbb","cccc"); mysql_select_db("dddd",$db_Handle1); //データベース2にアクセスします。 $db_Handle2 = mysql_connect("eeeee","ffff","gggg"); mysql_select_db("hhhh",$db_Handle2); //状態が1になっているものを選択します。 $abc=mysql_query("SELECT * FROM TEST1 WHERE JOUTAI='1' ",$db_Handle1); while ($row = mysql_fetch_array($abc, MYSQL_ASSOC)) { //管理番号をひとつずつ抜き取って処理していきます。 $kanri_no=$row["KANRI_NO"]; //増やした数をデータベース2に反映させます。 mysql_query("UPDATE TEST2 SET KAZU = KAZU+ 1 WHERE KANRI_NO='$kanri_no'",$db_Handle2); }
ご回答ありがとうございます。
(見直し点1)コネクトは1回
mysql_connect をループ内で毎回行うと、ループした数だけデータベースへの道が作られ、
それぞれ独立したものとして維持管理される事となり、非常に無駄です。
ループ前に1回だけ行うようにします。
(見直し点2)データベースのハンドル名は分ける
ハンドル名が同じだと、後からのものだけが有効となってしまいます。
$db_Handle1 = mysql_connect("aaaaa","bbbb","cccc");
$db_Handle2 = mysql_connect("eeeee","ffff","gggg");
(見直し点3)mysql_select_db、や mysql_query などは省略形にしない。
省略すると「直前の接続だけを使う」事になってしまいますので、
複数同時接続の場合は基本的に省略できません。
$db1 = mysql_select_db("dddd", $db_Handle1);
$abc = mysql_query("SELECT * FROM TEST1 WHERE JOUTAI='1' ", $db_Handle1);
$db2 = mysql_select_db("hhhh", $db_Handle2);
$def = mysql_query("SELECT * FROM TEST2 WHERE KANRI_NO=".$kanri_no." ", $db_Handle2);
mysql_query("UPDATE TEST2 SET KAZU=".$zaiko." WHERE KANRI_NO=".$kanri_no." ", $db_Handle2);
(見直し点4)確認点がない。
接続に成功したかどうかなど、必要な確認を入れていないので、
どこでトラぶっているかの判別が非常に難しくなる。
見直し点はまだまだあり、とてもじゃないけど短文では言い表せないので、
とりあえず大きな点だけあげました。
以下、動作確認までは行っていませんが、極力、元のコードの形をとどめて、
書いてみましたので適宜確認しながら適用していってください。
$db_Handle1 = mysql_connect("aaaaa","bbbb","cccc"); if (!$db_Handle1) { echo "データベース1への接続に失敗"; exit; # 失敗なので、ここで終了 } $db1 = mysql_select_db("dddd", $db_Handle1); $abc = mysql_query("SELECT * FROM TEST1 WHERE JOUTAI='1'", $db_Handle1); $abc_count = mysql_num_rows($abc); if (!$abc_count) { echo "該当するデータは見つかりませんでした。"; exit; # 書き換えるべきデータは無いので、ここで終了 } $db_Handle2 = mysql_connect("eeeee","ffff","gggg"); if (!$db_Handle2) { echo "データベース2への接続に失敗"; exit; # 失敗なので、ここで終了 } $db2 = mysql_select_db("hhhh", $db_Handle2); while ($row = mysql_fetch_array($abc, MYSQL_ASSOC)) { $kanri_no = $row["KANRI_NO"]; $def = mysql_query("SELECT * FROM TEST2 WHERE KANRI_NO=" . $kanri_no, $db_Handle2); while ($row = mysql_fetch_array($def, MYSQL_ASSOC)) { $zaiko = $row["KAZU"]; $zaiko++; $u = mysql_query("UPDATE TEST2 SET KAZU=" . $zaiko . " WHERE KANRI_NO=" . $kanri_no, $db_Handle2); } }
※UPDATEに成功したかどうか、何件処理したかについては下記コマンドを参照ください。
ご回答ありがとうございます。
ご回答ありがとうございます。