• 締切済み

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."分に表示されますよ^^"; } } >

みんなの回答

回答No.3

#2の人と同じだけど$freedb->queryでSQL送ってないよね。 それと同じ処理内で $ndb=new PDO("sqlite:nagasaki.db3"); と $freedb=new PDO("sqlite:FREE.db3"); を分ける意味は?

kira6555
質問者

お礼

確認事項の件ですが、GETしたテキストを データベース(nagasaki)のテーブルのフィールドデータと比較し trueならデータベース(FREE)へUPDATE、falseなら弾くといった処理を しております。 else処理や例外処理を消してソースを掲載したので、流れが分かりにくかったですね。 すみません。 仕様の変更でSQliteのデータベースを組み直し、 実行したところ、上手く作動しました。 原因が追求できず、たまたま上手くいっているだけなのか、 致命的なエラーがあるのか、ハッキリしてない状態です。 しかし、テーブルスキーマは変更してないのになぜだろう・・・ 回答ありがとうございました

回答No.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つめまでしかやってないです。

kira6555
質問者

お礼

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

  • gtx456gtx
  • ベストアンサー率18% (194/1035)
回答No.1

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

kira6555
質問者

お礼

おっしゃる通りトランザクションはautoみたいですね。 COMMITの概念を完全に忘れていました。 非常に参考になりました。 ちなみにBIGINとCOMMITを設定することで、 非常にアクセスが早くなるそうですね。 また、一つ勉強になりました。 仕様の変更でSQliteのデータベースを組み直し、 実行したところ、上手く作動しました。 原因が追求できず、たまたま上手くいっているだけなのか、 致命的なエラーがあるのか、ハッキリしてない状態です。 回答ありがとうございました。

関連するQ&A