こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

締切り済みの質問

PHPからSQLite3のUPDATEができない。

初心者にて情報不足がありましたらすみません。
domainking(レンタルサーバー)上でPHPからSQlite3を操作しています。
現象としては、エラーは吐かないのですが、データベースの中身が書き換わりません。
手続きの流れは、htmlのフォームからデータを受け取りデータベース(a)のテーブル内のデータと照合。
データベース(a)を閉じ、データベース(b)へ、受け取ったデータを”更新”としたいわけなのですが、
データベース(a)の接続は上手くいき、照合(SELECT)もOKです。
問題はデータベース(b)のUPDATEが上手くいかずに困っております。
データベース(b)へSELECT文を入れてみたら、上手くいきましたので、多分接続は出来ているようです。
パーミッション設定はデータベース及びデータベースをおいてあるフォルダともに”777”です。
又、domainking(レンタルサーバー)のPHP設定はチェックを入れて、セーフモードのチェックは外しております。
ソースは下記です。わかる方おられましたら、ご教示いただけると有難いです。
文字型のチェックとかしてましたので、非常に見苦しいです。すみません。
それと、エラーチェックは敢えて外しております。

<?php
$thours=date(G);
$tminutes=date(i);
$seconds=date(s);

$tminutes5=$tminutes+5;

if ($tminutes5>59){
$ttminutes=$tminutes5-60;
$tthours=$thours+1;
}
else{
$ttminutes=$tminutes5;
$tthours=$thours;
}

if ($ttminutes<10){
$minutes="0".$ttminutes;
}
else{
$minutes=(int)$ttminutes;
}

if($thours==0){
$hours=$thours+24;
}
else{
$hours=$thours;
}

$sshoptel=$_POST["inputtel"];
$shoptel=(int)$sshoptel;
$ndb=new PDO("sqlite:nagasaki.db3");
$nqry="SELECT * FROM nagasaki WHERE shoptel=$shoptel";
$ndata=$ndb->query($nqry);
$nvalue=$ndata->fetch(PDO::FETCH_ASSOC);
$shopname=$nvalue["shopname"];
$ndb=null;

if($shopname<>null){
$time=$hours.$minutes;
$tempimg=$_FILES["inputimg"]["name"];
$extension=pathinfo($tempimg,PATHINFO_EXTENSION);
$pgirlname=$_POST["inputname"];
$shoptel=$_POST["inputtel"];
$pcomment=$_POST["inputcomment"];
$girlname="&quot;".$pgirlname."&quot;";
$itime=(int)$time;

if (is_uploaded_file($_FILES["inputimg"]["tmp_name"])) {
if (move_uploaded_file($_FILES["inputimg"]["tmp_name"], "img/". $time.".".$extension)) {
$freedb=new PDO("sqlite:FREE.db3");
$uqry="UPDATE FREE SET girlname=$girlname WHERE time=$itime";
$freedb=null;

print "投稿有り難うございます。".$shopname."の".$girlname."さんですね。".$hours."時".$minutes."分に表示されますよ^^";
}
}
>

投稿日時 - 2011-02-18 16:53:25

QNo.6532416

困ってます

このQ&Aは役に立ちましたか?

1人が「このQ&Aが役に立った」と投票しています

回答(3)

ANo.3

#2の人と同じだけど$freedb->queryでSQL送ってないよね。

それと同じ処理内で
$ndb=new PDO("sqlite:nagasaki.db3");

$freedb=new PDO("sqlite:FREE.db3");
を分ける意味は?

投稿日時 - 2011-02-18 21:14:14

お礼

確認事項の件ですが、GETしたテキストを
データベース(nagasaki)のテーブルのフィールドデータと比較し
trueならデータベース(FREE)へUPDATE、falseなら弾くといった処理を
しております。
else処理や例外処理を消してソースを掲載したので、流れが分かりにくかったですね。
すみません。

仕様の変更でSQliteのデータベースを組み直し、
実行したところ、上手く作動しました。
原因が追求できず、たまたま上手くいっているだけなのか、
致命的なエラーがあるのか、ハッキリしてない状態です。
しかし、テーブルスキーマは変更してないのになぜだろう・・・
回答ありがとうございました

投稿日時 - 2011-02-20 21:27:01

ANo.2

$uqry="UPDATE FREE SET girlname=$girlname WHERE time=$itime";

$uqryに文字列としてSQL文をセットしているだけで、その後なにもしてないので、
DBに反映されないのは、当然ですね。

1)DBに接続、
2)SQL文を準備
3)そのSQLを実行
4)必要に応じてその結果を取り出す
 2)-4)を繰り返す
5)DBを切断

のうち2つめまでしかやってないです。

投稿日時 - 2011-02-18 17:26:10

お礼

全くもってその通りですね。
但し、これは、私のペーストミスです、本当、申し訳ないです。
構文としては、
$freedb->exec($uqry);
にてSQLを実行しております。
失礼しました。
その上で、表題の上手く作動しないとの質問でした。
2度手間になりすみません。
ただ、仕様の変更でSQliteのデータベースを組み直し、
実行したところ、上手く作動しました。
原因が追求できず、たまたま上手くいっているだけなのか、
致命的なエラーがあるのか、ハッキリしてない状態です。
回答ありがとうございました。

投稿日時 - 2011-02-20 21:18:51

ANo.1

>現象としては、エラーは吐かないのですが、データベースの中身が書き換わりません。
データベースでエラーが発生せず、更新されな場合は・・・「COMMIT」が実行されていない! って感じではないかと思いますが「COMMIT」してます?

ただ、SQLiteはディフォルトでAutocommitがONのはずだけど???

投稿日時 - 2011-02-18 17:15:19

お礼

おっしゃる通りトランザクションはautoみたいですね。
COMMITの概念を完全に忘れていました。
非常に参考になりました。
ちなみにBIGINとCOMMITを設定することで、
非常にアクセスが早くなるそうですね。
また、一つ勉強になりました。

仕様の変更でSQliteのデータベースを組み直し、
実行したところ、上手く作動しました。
原因が追求できず、たまたま上手くいっているだけなのか、
致命的なエラーがあるのか、ハッキリしてない状態です。
回答ありがとうございました。

投稿日時 - 2011-02-20 21:22:19

あなたにオススメの質問