• ベストアンサー

作成済みのsql文を自動で実行させる方法

現在レンタルサーバーにて、不動産検索サイトの簡易的なようなものを運営しています。 phpとmysqlで動かしているのですが、新たに不動産を追加するときはあらかじめsql文作成ページで必要事項を打ち込むことで生成しておいたinsertのsql文を(一度に何行も作成しておいています)、手動で一定時間ごとにphpmyadminに直接放り込んでいます。 このあらかじめ何行も作成してあるinsertのsql文を一定時間ごとに一行一行放り込む作業を自動化したいのですが、どのようにすればいいでしょうか? もしくはこれは根本的にできないことなのでしょうか? よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.2

考え方は3つあります。 (1)ガンガンデータを投入してしまい、情報公開日時をデータに設定しておく 表示の際は情報公開日時とnow()を比較する (2)同じくデータを投入してしまい、非公開フラグを設定しておき、 cronで公開のタイミングでフラグを非公開から公開にかえる 表示の際は非公開フラグをチェックする (3)データ投入をcronでやる phpでやってもいいですし、mysqlにダイレクトにSQLを発行してもよいでしょう

rialrialrial
質問者

お礼

なるほどnow()と比較というのは思いつかなかったです。 これとcronを使ってif文でうまくできそうです。 ありがとうございました。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (2)

  • nora1962
  • ベストアンサー率60% (431/717)
回答No.3

FreeBSDならcron実行できますから。 #!/bin/sh mysql -u ユーザー名 -pパスワード データベース名 < SQLファイル cat < /dev/null > SQLファイル という実行ファイルa.shを作り flock --timeout=999 SQLファイル ./a.sh をcronに設定します。 逆にphpでSQLファイルにINSERTコマンドを追加する際にはflockを使ってファイルロックしてからにしてください。

rialrialrial
質問者

お礼

シェルスクリプトに明るくなかったので少し調べましたが、こういう方法もあるのですね。 ありがとうございます。

全文を見る
すると、全ての回答が全文表示されます。
  • nora1962
  • ベストアンサー率60% (431/717)
回答No.1

何故、打ち込んだタイミングでSQLを実行しないのですか? 作成してあるSQLはファイルなどに保存してあるのでしょうか? レンタルサーバーのOSは何ですか(Unix/Linuxなどならcronで定期的にコマンド実行できます)?

rialrialrial
質問者

補足

打ち込んだタイミングでSQLを実行しない理由は、更新頻度を一定に(定期的に)保ちたいからです。 SQLは適当にテキストとして保存しています。普段そこから適宜一部を実行しています。 さくらインターネットのレンタルサーバーを使用しているのですが、調べたところ、OSの種類はUNIX系OS、OS名はFreeBSDというものです。 さくらインターネットのレンタルサーバーではcronは設定できます。 少し調べたのですが、cronを使ってphp等を動かしたとして、もとからあるSQL文を定期的に実行することはできないような気がしたのですがどうでしょうか? 私のphpのプログラミング技術の無いせいでそう感じているだけで、これはできるものなのでしょうか? できるとすれば、どういったアルゴリズムで組めばいいのでしょうか? よろしくお願いします。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • php上でSQL文を実行した結果と、phpMyAdminで実行した結果が違う

    ☆実行環境 php5.3 MySQL4.0 $sql="SELECT * FROM テーブル名 WHERE フィールド名 like '".$変数."%'" php上で上記のようなSQL文を実行させようとしています。 テーブルには該当する行がいくつかあるのですが、ページ上では1行も表示してくれません。 mysql_num_rowsの返り値を見ると0になっています。 SQL文の組み立てがおかしいのかと思い、phpMyAdmin上でSQL文を実行すると、 きちんと欲しい内容が表示されます。 とするとphpでのSQL文の書き方がおかしいのだと思います。 どこかおかしいのかご教授ください。

    • ベストアンサー
    • PHP
  • SQLをバッチで実行

    掲題の件で少し教えていただきたいことがあります。 バッチファイルでSQLPLUSを起動し、 @XXXXXXXXX.SQL >> XXX.log(バッチのログ)と 実行するのですが、このSQL文がインサート文や アップデート文など通常のSQL文だと バッチでのリダイレクションの結果に XX行作成されました。とかXX行更新されましたとか 出力されると思うのですが、 実行するSQL文の中でさらに、 @XXXXXXXXX.SQL と記述していると どのようにログファイルに出力されますか? XX行作成されました。とかXX行更新されましたとか が出るとうれしいのですが… わかりにくい質問かもしれませんがお願いいたします。

  • ファイルに記述されている複数のSQL文を一度に実行させたい

    こんにちわ。 ファイルに記述されているSQL文を、Linuxのコマンドラインなどから 実行したいと考えています。 ファイルに insert into DB_NAME(aaa,bbb,ccc) values(111,222,333); insert into DB_NAME(ddd,eee,fff) values(333,777,222); insert into DB_NAME(aaa,ttt,ddd) values(111,000,999); ... などのSQL文が複数行(例えば1000個ほど)記述しているのを用意して なんかしらの方法で一度に実行させたいのです。 mySQLでは、このようなやり方があるのですが postgreではどのようにすればいいのか、わかりません。 どなたかご存知の方、よろしくお願い致します。 OSはLinuxです。

  • MysqlのSQL文について

    AccessとMysqlを用いてデータベースシステムを作成しています。 添付図の左の表から,右の表の品番と枝番が一致するデータを削除する場合(今回はaaaの2と6)は,どのようにSQL文を記述すればよいでしょうか? Do Untilで1行毎に比較して削除する方法では時間がかかり過ぎたため,SQL文で一度で処理できないかと考えたのですが,SQL文をどのように記述すればよいかわかりませんでした... お分かりになられる方がいらっしゃいましたら,ご教授宜しくお願い致します。

    • ベストアンサー
    • MySQL
  • phpMyAdminのSQLクエリ実行について

    MySQLでデータベースを作ろうとしてphpMyAdminの、SQL>>『テキストファイルの場所』みたいなとこに.sqlのファイルを.gzに圧縮して、"gzip 方式"にチェックをして実行をしようとしましたがいかんせん時間がかかりすぎてなかなか実行できません。.gzのファイルの重さは1000KB足らずなのですが・・・。 1000KBは実行には重いんでしょうか?また、このような状況になったときに他にクエリを実行するにはどうしたらいいでしょうか? クエリはCREATE TABLEとINSERT INTOです。長文失礼しました。

    • ベストアンサー
    • MySQL
  • JavaでのSQL文の実行について

    JavaでのSQL文の実行について Class.forName("org.gjt.mm.mysql.Driver"); con = DriverManager.getConnection("jdbc:mysql://localhost/testdb?useUnicode=true&characterEncoding=UTF-8", "id", "pw"); stmt = con.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); sql = new StringBuffer(); sql.append("set @i:=0;select id,@i:=@i+1 as 'num',name,kana from table order by kana"); rs = stmt.executeQuery(sql.toString()); ResultSetMetaData rsmd = null; rsmd = rs.getMetaData(); tbl = new ArrayList<ArrayList>(); //検索結果 取得 if(rs.next()){ ・ ・ ・ ・ といった形でSQL文を実行してるのですが、うまくいきません。 MySQLのバージョンは5.1です。MySQL上でこのSQLを実行するとしっかり結果は取得できたので、Javaプログラムの書き方に問題があると思うのですが、上記のように一度で二つのSQL文を実行することはできないのでしょうか。単一のSQLの実行は正常にできています。ユーザ変数は取得された結果一覧に行番号を付与するために使っています。 2回に分けてこのSQLが実行できるのであれば、その方法でも良いので教えてもらいたいです。 つたない説明で申し訳ないですが、よろしくお願いします。

    • ベストアンサー
    • Java
  • データのインポートの速度について

    mysqlの1個のテーブル(約1万行)をphpMyAdminでエクスポートしました。エクスポートは一瞬で終わりました。 それを再びphpMyAdminからインポートしようとしたのですが、データが重いらしくタイムアウトのエラーが出てしまいました。 sqlファイルを開いてみると、テーブルへのinsert文が約200行ずつのかたまりごとに区切られてしました。 きっとphpMyAdminの方で、エクスポートする時、「これくらいのかたまりずつ区切っておかないと、スムーズにインポートできなくてエラーになっちゃうよ」と気を利かせて区切ってくれているのだろうと思います。 仕方ないので、sqlファイルを「約200行ずつのinsert文」に分割して、phpMyAdminからインポートしました。 全部で1万行ほどのデータなので、50回ほどその作業を繰り返しました。 エクスポートはスムーズだったので、インポートがこんなに手間がかかるとは思っていませんでした。 最初にその1万行のデータをテーブルに読み込ませたのは、別のcsvファイルを load data infile したり、項目の並び順を入れ替えて insert したりするphpファイルを書いたのですが、さほど重くもなくスムーズに処理できました。 phpMyAdminを使わない方法の方が圧倒的に早い気がするのですが、大きいデータをインポートする際のスムーズな方法がありましたら、アドバイスいただけますでしょうか?

  • SQL*Plusの実行結果にSQL文も残したいです

    SQL*Plusをスクリプトファイルを使って実行した際、実行SQLの出力はできないものでしょうか? 以下のようにスクリプトファイルを使ってSQL*Plusを実行し、その結果をログファイルへ 残しています。この時ログファイルには、実行結果は出力されるのですが、実行SQLは 出力されないようです。なんとかして実行SQLと、実行結果を作業ログとして残したいと 考えているのですが、何かよい方法はないものでしょうか? [ama@rh01 test]$ sqlplus scott/tiger@orcl @test01.sql > test01.log ■環境 Red Hat Linux 4 Oracle10g ■以下test01.sqlの中身です。 ---ここから-------------- create table ex01 ( c1 number, c2 varchar2(10), c3 varchar2(40) ); insert into ex01(c1,c2,c3) values(1,'AA1','BBB1'); select * from ex01; update ex01 set c2='aa1' where c1 =1; select * from ex01; exit; ---ここまで-------------- ■以下ログファイルの中身です。 ---ここから------------------ [ama@rh01 test]$ cat test01.log 省略 With the Partitioning, OLAP and Data Mining options に接続されました。                       ←ここにcreate文を出力したいです。 表が作成されました。                       ←ここにinsert文を出力したいです。 1行が作成されました。                       ←ここにselect文を出力したいです。 C1       C2   C3 ---------- ---------- ---------------------------------------- 1        AA1   BBB1                       ←ここにupdate文を出力したいです。 1行が更新されました。                       ←ここにselect文を出力したいです。 C1      C2 C3 ---------- ---------- ---------------------------------------- 1 aa1 BBB1 Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Production With the Partitioning, OLAP and Data Mining optionsとの接続が切断されました。 [ama@rh01 test]$ -------------------ここまで--------------- どなたか良いアドバイスいただけたらと思います。 どうぞよろしくお願いします。

  • php+mysql sql文実行について

    データベースに「日付」「文章」を登録し、今日の日付に対応した文章が表示される仕組み(正確には朝の5時に変更)を作りたいと考えております。 以前は日付をタイトルとしたtxtファイルを作成し、その中身を読み込ませる仕組みだったのですが、今回mysqlを使用して同様のものを作成できればと思い試行錯誤しております。 データベースは 「maxim」というテーブルの中に、 date   main 071018 (文章)  071019 (文章) 071020 (文章) 071021 (文章) のように格納してあります。 date:主キー、varchar(6)、not null main:text、not null 作成したスクリプトは以下の通りですが、これを実行すると「エラー」が表示されてしまいます。 $dateによる文字列の取得、DBへの接続までは、echo、or dieにて確認済、またsql文をphpMyadminから実行した場合($dateを071018に書き換えて)、こちらも正常に取得できたのですが。 $dateをsql文に記述する際の囲みの問題かとも思い、「''」や「()」や「[]」で囲ってもみたのですがだめでした。 どなたかお知恵を拝借できますでしょうか。 宜しくお願い致します。 *サーバー、mysqlはともに「ロリポップ」を使用しております。 <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=shift_jis"> <title>テスト</title> </head> <body> <?php $date=strftime("%y%m%d",time()-5*3600); $server="mysql**.***.jp"; $dbname="********"; $user="********"; $pass="*****"; $conn = mysql_connect($server,$user,$pass); $sql="SELECT main FROM maxim WHERE date = '$date'"; $res=mysql_query($sql,$conn) or die("エラー"); echo "<b>$res</b>"; mysql_close($conn); ?> </body> </html>

    • ベストアンサー
    • PHP
  • PHP+mysqlでSQL文に文字数制限はありますか?

    基本的な質問で申し訳ありません。 $sql="......";にSQL文を書き $rst = mysql_query($sql,$con); $col = mysql_fetch_array($rst); として($conはmysql_connect関数の結果です) WEBを作成しているのですが、ある程度以上長いSQL文を書くと正常に作動しません。(短いSQLであれば正常に差作動します。)  当然SQL文自体もmysqlで直接実行すると作動するものです。SQL文自体がUNIONや副問い合わせを多用し250行程度になってしまったためかと考えていますが、文字数制限等があるのでしょうか?PHPには変数宣言が無いと認識しているのでどう対処して良いかわかりません。 SQLを分解できないとすると何か良い方法はありますでしょうか? よろしくお願いいたします。

    • ベストアンサー
    • PHP
このQ&Aのポイント
  • LenovoH530sのWindows10を64ビットにしようとしたが失敗し、ネットワークも繋がらず画面も拡大されてしまった。Windows7の32ビットに一度戻してからWindows7の64ビットにし、再びWindows10にした方が良いとの情報がある。しかし、Lenovoサイトでリカバリディスクを入手する方法がわからない。初心者でも分かりやすく教えてほしい。
  • LenovoH530sのWindows10を64ビットにするために手順を試みたが失敗し、ネットワークも画面も正常に動作しない状態になった。Windows7の32ビットに戻してからWindows7の64ビットにし、再度Windows10にアップグレードする方法が良いとの情報があるが、リカバリディスクの入手方法がわからない。初心者向けに教えてほしい。
  • LenovoH530sのWindows10を64ビットにするための手順で失敗し、画面が拡大されたままでネットワークもつながらない状態になった。Windows7の32ビットに戻してからWindows7の64ビットにし、再度Windows10にアップグレードする方法が推奨されているが、リカバリディスクの入手方法がわからない。初心者にもわかりやすく教えてほしい。
回答を見る