• 締切済み

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

  • PHP
  • 回答数3
  • ありがとう数4

みんなの回答

回答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

  • php、sqlite3にデーター追加できない

    phpでsqlite3のデーターベースにデーターの追加が出来ず困ってます。 コードは以下の通りです。 <?php //変数のセット $name = $_POST["name"]; $usrid = $_POST["usrid"]; $usrpw = $_POST["usrpw"]; $email = $_POST["email"]; $ddate = $_POST["ddate"]; //データーベース接続 $dbh = new PDO("sqlite:data",null,null); //新規登録 $sql = "INSERT INTO meibo (name,usrid,usrpw,email,ddate) VALUES ('$name','$usrid','$usrpw','$email','$ddate')"; $sth = $dbh->prepare($sql); $sth->execute(); $dbh = null; localhostでは実験済なのですが webサーバーにアップすると追加が出来なくなります。 一覧表示や検索は可能な状態です。 どこに問題があるのかお分りの方、お教えいただけないでしょうか? 宜しくお願いいたします。

    • ベストアンサー
    • PHP
  • PHP5でSQLiteが接続エラーを出します

    PHPには初心者です(データベースには多少知識有るはず)。 PHPからSQLに商品データを登録するシステムを作っていますが、データベースに接続することができません。 繋げるためにはどこを直したらよいでしょうか。 データベース名はshop、テーブル名はitemです。 SQLite:バージョン 2.8.17 PHP:バージョン 5.1.6 WindowsXPのプロフェッショナル、eclipse3.2、参考にした本は『eclipseではじめるPHP(http://item.rakuten.co.jp/book/4296315/)』と『基礎PHP(http://item.rakuten.co.jp/book/1711777/)』です。 エラーが出る行 if(!$db = sqlite_open('/../SQLiteManager/shop')){ die("データベース接続エラー.<br/>"); } エラー文 Warning: sqlite_open() [function.sqlite-open]: unable to open database: C:\SQLiteManager\shop in C:\Eclipse\workspace\shop\touroku.php on line 23 データベース接続エラー. PHPのフォルダ内にある 『PHP.iniextension=php_pdo_sqlite.dll』 『extension=php_sqlite.dll』 のコロンは外しました。 SQLiteManagerはworkspaceの中です。 設定が悪いのかファイルを置く場所が悪いのか、それともプログラムが悪いのかもわかりません。 宜しくお願いいたします。

    • 締切済み
    • PHP
  • SQLITEの構築について

    現在、レンタルサーバーでSQLITEを使おうと思い、 <html> <head><title>PHP TEST</title></head> <body> <?php $link = sqlite_open('test.db', 0666, $sqliteerror); if (!$link) { die('接続失敗です。'.$sqliteerror); } print('接続に成功しました。<br>'); // SQLiteに対する処理 sqlite_close($link); print('切断しました。<br>'); ?> </body> </html> と、スクリプトを組んだのですが、ブラウザでアクセスすると Call to undefined function sqlite_open()という、エラーが出てしまいます。これがsqlite_open()関数が定義されていないという意味はわかるのですが、何故このエラーが表示されるのか理解できません。 レンタルサーバーではSQLITEが使えるとかかれており、またphpのバージョンも5.1.6と、SQLITEが標準でバンドルされているはずなんですが、何もしようともcall to undefined ~~  というエラーが出てしまいます。 レンタルサーバー内でこのエラーを出さず、sqliteを使えるようにするにはどうしたらよいでしょうか?ご教授お願いします。 また、余談かもしれませんが、自分なりに、検索し、調べた結果、php.iniというファイルを作成し display_errors = On extension=php_pdo_sqlite.dll extension=php_pdo.dll extension=php_sqlite.dll と、書き込んだファイルをサーバーにあげたのですが、無意味でした。 よろしくお願いします。

    • ベストアンサー
    • PHP
  • SQLiteでのDateTimeの扱い

    SQLiteのデータベースにphpで値を保存したいのですが、カラムのタイプがdatetimeだと上手くいきません。 現在の時刻をSQLiteに書き込むということをしたいです。 カラムのタイプをdatetimeからtextに変更するのは避けたいので、下のphpを変更して書き込めるようにするにはどうすれば良いのでしょうか? 詳しい方よろしくお願いします。 SQLite DB ---- CREATE TABLE "dt" ("ID" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL ,"REGIST" DATETIME) ---- PHP ---- $sqlite = 'SQLiteへのパス'; $db = new PDO($sqlite); $now = date('Y-m-d H:i:s'); $nfe = $db->prepare('insert into dt(REGIST) values(?)'); $nfe->execute(array($now)); ----

  • メソッドと配列の処理速度について

    プログラムをはじめたばかりの初心者なので見当違いな事を質問していたらすみません。 他人のコードを見ていた時に以下のようなコードがありました。 if( pathinfo($file,PATHINFO_EXTENSION)=="txt" || pathinfo($file,PATHINFO_EXTENSION)=="php" || pathinfo($file,PATHINFO_EXTENSION)=="csv"){ 処理..... } ※実際は条件でのpathinfo部分がもっと長いです。 で、気になったのがこれだと条件チェックする際に毎回pathinfoが呼ばれるのでは? というところです。 条件前に $hoge = pathinfo($file); としておき if($hoge['extension'] == 'txt' || $hoge['extension'] == 'php') などと記述した方が、pathinfoの呼び出しは一回のため速度的にも見た目的にも いいのではないでしょうか? 気になったので echo で pathinfo($file,PATHINFO_EXTENSION)を連続で出力するメソッドと 配列に格納した上で $hoge['extension']を連続出力するメソッドのtimeを測定してみたところ メッソド呼び出しを毎回行う方が高速になりました。 (高速といってもたいしたことありませんが) 個人的には配列に入れた方が早い気がしていたのですが この考え自体が間違った考えなのでしょう? 基本を知らないので検討違いな事言っていたらご指摘いただければ幸いです。 現在プログラムを勉強中なのですが、こんな事どーでもいいのかもしれませんが なんとなく気になったので質問させて頂いた次第です。

    • 締切済み
    • PHP
  • SQLiteでたまにアクセスログが取れない

    PHPが使えないサーバーにあるホームページのアクセスログを取得するため、 JavaScriptを使ってPHPが使えるレンタルサーバーに飛び、 PHP+SQLite2でアクセスログを集計していました。 最近パソコンを買い替えたのを機にPHPをVersion 5.4.8にアップデートしたところ、 ローカル環境でSQLite2が使えなくなり、この際pdo_sqliteにプログラムを書き換えました。 レンタルサーバーではSQLite2 がまだ使えるため、以前のプログラムはそのままにして SQLite2 とPDO両方でログをとってみました。 するとSQLite2では取れているのにPDOでは取れていない、 逆にPDOでは取れているのにSQLite2では取れていないログがあることに気が付きました。 (詳しくは下記の画像をご覧ください 赤丸がついているものが他方にはないログです) https://box.yahoo.co.jp/guest/viewer?sid=box-l-oolzr4jkzfiedw4zavuldosoha-1001&uniqid=12bc9230-5e96-41fb-b00e-271a1aa79397&viewtype=detail#du%3D12bc9230-5e96-41fb-b00e-271a1aa79397%26ds%3Dbox-l-oolzr4jkzfiedw4zavuldosoha-1001%26tu%3D12bc9230-5e96-41fb-b00e-271a1aa79397%26ts%3Dbox-l-oolzr4jkzfiedw4zavuldosoha-1001%26vt%3Dpublic%26lf%3Dlist%26ls%3D1%26lm%3D20%26il%3D1 何が問題なのでしょうか? プログラム? SQLite? PHP? サーバー? 閲覧者のブラウザ? また回避法をご存知でしたらご教授願います。 (log.js) ref =document.referrer; var qword=""; if(ref.indexOf("?")!=-1){ ref2=ref.split("?"); query=ref2[1].split("&"); qword="?qword="; for (i=0; i<query.length; i++){ qword+=query[i]+"*"; } ref=ref2[0]; } document.write('<script src=" http://○○○/log2.php?ref='+ ref + qword +'"></script>'); document.write('<script src=" http://○○○/log.php?ref='+ ref + qword +'"></script>'); (log.php) <?php $referer = stripslashes($_GET['ref']); $d=date_create(); $date=date_format($d,"Y/m/d"); $time=date_format($d,"H:i:s"); $day=date_format($d,"w"); $referer=sqlite_escape_string($referer); $url=sqlite_escape_string($_SERVER['HTTP_REFERER']); $accept_language=sqlite_escape_string($_SERVER['HTTP_ACCEPT_LANGUAGE']); $remote_addr=sqlite_escape_string($_SERVER['REMOTE_ADDR']); $user_agent=sqlite_escape_string($_SERVER['HTTP_USER_AGENT']); $db=sqlite_open("log.sqlite"); $sql="INSERT INTO log_table ( log_date, log_time, log_day, log_url, log_referer, log_language, log_remote_addr, log_user_agent) VALUES( '$date', '$time', $day, '$url', '$referer', '$accept_language', '$remote_addr', '$user_agent')"; sqlite_query($db,$sql); sqlite_close($db); (log2.php) <?php $referer = stripslashes($_GET['ref']); $d=date_create(); $date=date_format($d,"Y/m/d"); $time=date_format($d,"H:i:s"); $day=date_format($d,"w"); $db=new PDO("sqlite:/home/○○○/www/log.sqlite3",null,null); $referer=$db->quote($referer); $url=$db->quote($_SERVER['HTTP_REFERER']); $accept_language=$db->quote($_SERVER['HTTP_ACCEPT_LANGUAGE']); $remote_addr=$db->quote($_SERVER['REMOTE_ADDR']); $user_agent=$db->quote($_SERVER['HTTP_USER_AGENT']); $sql="INSERT INTO log_table ( log_date, log_time, log_day, log_url, log_referer, log_language, log_remote_addr, log_user_agent) VALUES( '$date', '$time', $day, $url, $referer, $accept_language, $remote_addr, $user_agent)"; $res=$db->prepare($sql); $res->execute(); $db=null; レンタルサーバーの環境 さくらインターネット PHP Version 5.2.17 Apache/1.3.42 (Unix) mod_ssl/2.8.31 OpenSSL/0.9.8e SQLite 2.8.17 pdo_sqlite 3.3.7

    • 締切済み
    • PHP
  • デジタル時計の文字色を変えたい。。。

    デジタル時計の部分を 時計の絵にはめこんでいるのですが、 現在の文字色は赤です。 onClipEvent (load) { function TIME() { hour = nowtime(); } // End of the function function nowtime() { n_time = new Date(); hours = n_time.getHours(); minutes = n_time.getMinutes(); seconds = n_time.getSeconds(); if (seconds < 10) { seconds = "0" + n_time.getSeconds(); } // end if if (minutes < 10) { minutes = "0" + n_time.getMinutes(); } // end if if (hours < 10) { hours = "0" + n_time.getHours(); } // end if n_hour = hours + ":" + minutes + ":" + seconds; return (n_hour); } // End of the function } onClipEvent (enterFrame) { this.TIME(); } 上記のどこを変えるとデジタルの色を変えることができるのでしょう? 宜しくお願いいたします。

    • ベストアンサー
    • Flash
  • PHP-SQLiteに於いて、複数列の検索方法を教えてください

    SQLiteの複数列の検索 SQLiteの勉強を始めたばかりなのですが、 複数列の検索方法が解らなくて、 色々調べましたが解らなかったので質問させてください。 データベースの中が |ID  |  氏名  |  住所       |  電話番号 |----|-------|--------------|--------------- |1  |山田   |埼玉県******** |03******** |2  |田中   |東京********** |03******** |3  |佐藤   |千葉県******** |090******** |4  |佐々木  |埼玉県******** |090******** ----------------------------------------------------- 期待する動き 例1) 住所:埼玉県 と検索すると 山田,埼玉県********,03******** 佐々木,埼玉県********,090******** と表示される 例2) 名前:山田 住所:埼玉県 と検索すると 山田,埼玉県********,03******** と表示される ※ユーザーからはどの項目を検索対象とされるか解らない。 test.phpの内容 //フォームからID取得 $search_id = $_POST['id']; //フォームから氏名取得 $search_user_name = $_POST['search_user_name']; //フォームから住所取得 $search_home_address = $_POST['search_home_address']; //フォームから電話番号取得 $search_tel_num = $_POST['search_tel_num']; //フォームからの入力データを格納 $chk_data = "$search_id,$search_user_name,$search_home_address,$search_tel_num"; //比較する列名配列変更用カウント変数 $i = 0; //比較する列名 $chk_db_line = array("id", "user_name", "home_address", "tel_num"); //データベース列名格納 $all_data = "id,user_name,home_address,tel_num"; //ユーザーが入力した検索項目をカンマ区切りで配列に格納 foreach($chk_line as $chk_ln){ //ユーザーが入力した検索項目をチェック if( ($chk_ln === "") || ($chk_ln === NULL) ){ //比較する列名配列変更用カウント変数インクルメント $i++; //ユーザーが入力した検索項目をチェックし値が入っている場合 }else{ //sqlite文の$query = WHERE以降を変数に代入 //ユーザーが入力した検索項目の個数は可変のため $sqlite_str .= $chk_db_line[$i]. " LIKE ". "'%". $chk_ln. "%' "; //比較する列名配列変更用カウント変数インクルメント $i++; } } //設定項目がなければ検索しない if(!$sqlite_str){ echo "検索項目が設定されていません。"; //設定項目あれば検索する }else{ //データベースオープン if($db = sqlite_open('./db/Personal_data')){ //検索 $query = "SELECT ".$all_data ." FROM tb1_personal_data WHERE ".$sqlite_str; $result = sqlite_query($db, $query); //検索結果表示 while($info = sqlite_fetch_array($result)){ echo "<tr>"; echo "<td>氏名</td><td align='left'>{$info['user_name']} </td>"; echo "</tr>"; echo "<tr>"; echo "<td>氏名</td><td align='left'>{$info['home_address']} </td>"; echo "</tr>"; echo "<tr>"; echo "<td>氏名</td><td align='left'>{$info['tel_num']} </td>"; echo "</tr>"; } //データベースクローズ sqlite_close($db); } } とすると、単体検索は成功しましたが、複数検索を行うとエラーが表示される 検索フォームから検索 例1) 住所:埼玉県 と検索すると 山田,埼玉県********,03******** 佐々木,埼玉県********,090******** と表示される 成功 例2) 名前:山田 住所:埼玉県 と検索すると Warning: sqlite_query() [function.sqlite-query]: near "home_address": syntax error in Warning: sqlite_fetch_array() expects parameter 1 to be resource, boolean given in とエラー表示が出ます。 そもそも考え違いをしていたらすいません。 どなたかよろしくお願いします。

    • ベストアンサー
    • PHP
  • sqlite3 group byがわかりません!!

    テーブル番号を入力すると、各テーブルごとの商品 数量 小計が表示されるようにしたいのですが、各テーブルの合計が表示できません。ご教授お願い致します! <?php $ban = $_POST['ban']; $kazu = $_POST['kazu']; $tno = $_POST['no']; //テーブル番号 $pdo = new PDO('sqlite:db/syouhin.db'); $st = $pdo->query("SELECT * FROM list WHERE tno='" . $_POST["no"] . "' "); while ($row = $st->fetch()) { $tno = htmlspecialchars($row['no']); $id = htmlspecialchars($row['id']); $name = htmlspecialchars($row['name']); $kin = htmlspecialchars($row['kin']); $kazu = htmlspecialchars($row['kazu']); $kei = htmlspecialchars($row['kei']); echo "<td>$id</td><td>$name</td><td>$kin</td><td>$kazu</td><td>$kei</td><tr>"; } $st = $pdo->query('SELECT sum(kei) as kei FROM list group by tno');//←tno( テーブル番号カラム名 if ($row = $st->fetch()) { $tno = htmlspecialchars($row['tno']); $gokei = number_format($row['kei']); echo '¥'."$gokei"; }

    • ベストアンサー
    • PHP
  • PHP、SQLite3のデーターでログイン認証

    PHP、SQLite3のデーターベースでログイン認証をさせたいのですが、うまくいきません。 MySQL用のコードを自分でSQLite3用に改造したのですがやはり駄目でした。 コードは以下の通りです。 <?php // セッションの生成 session_start(); // ユーザー名/パスワード $usrid = htmlspecialchars($_POST['usrid'], ENT_QUOTES); $usrpw = htmlspecialchars($_POST['usrpw'], ENT_QUOTES); //データーベース接続 require_once('dbcon.php'); // データベースへの問い合わせSQL文 $sql = 'SELECT id,name FROM meibo WHERE usrid = "'.$usrid.'" AND usrpw = "'.$usrpw.'"'; $sth = $dbh->prepare($sql); $sth->execute(); // 認証 if ($row = $sth->fetch() == 1) { // ログイン成功 $login = 'OK';       $row = $sth->fetch();       // データーをセッション変数に保存 $_SESSION['id'] = $row->id; $_SESSION['name'] = $row->name; $_SESSION['usrid'] = $row->usrid; echo 'ログインに成功しました。'; } else { echo 'ログインに失敗しました。'; } //データーベース切断 $dbh = null; ?> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <title>Insert title here</title> </head> <body> <?php echo $_SESSION['id']; ?><br /> <?php echo $_SESSION['name']; ?><br /> <?php echo $_SESSION['usrid']; ?><br /> </body> </html> データーの表示、追加、削除は可能な状態です。 根本的に間違っているのでしょうか?またはちょっとした手直しで問題解決できるのでしょうか? お分りの方いらっしゃいましたらお教えください。

    • ベストアンサー
    • PHP