- ベストアンサー
PHPを使用してデータベースに共通項目数を格納する方法
- PHPを使用してデータベースに共通項目数を格納する方法を教えてください。
- データベース'compare'のテーブル'answers'に質問formから送信された回答と比較して、共通項目数を求め、データベース'compare'の'result'テーブルに結果を格納したい。
- PHPのコードを試しましたが、値が格納されませんでした。どうすればうまく格納できるでしょうか?
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
MySQLもphpも、最新記述が使えるversionですので、データベース接続部とSQL文発行のところを以下のようにすると良いでしょう。 <?php /* 接続DSN ここで文字コードを指定 */ $dsn='mysql:dbname=compare;host=localhost;charset=utf8'; $user='root'; $password=''; try{ $dbh=new PDO($dsn, $user, $password); /* 例外モードに設定 */ $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); $sql='SELECT code,r1,r2,r3 FROM answers WHERE 1'; $stmt=$dbh->prepare($sql); $stmt->execute(); $list = array(); while( $rec=$stmt->fetch(PDO::FETCH_ASSOC) ){ $s = 0; /* $question1, $question2, $question3 には、postデータを格納済みのこと */ if($rec['r1']==$question1) $s ++; if($rec['r2']==$question2) $s ++; if($rec['r3']==$question3) $s ++; $list[] = array( ':id'=>$rec['code'] , ':commons'=> $s ); } $sql = "INSERT INTO results (id, commons) VALUES (:id, :commons)"; $stmt = $dbh->prepare($sql); foreach ($list as $row) { $stmt->execute($row); } /* 新規素材情報をテーブルanswersの最後に格納。int型の場合は個別bind必要 */ $sql='INSERT INTO answers(r1,r2,r3) VALUES (?,?,?)'; $stmt=$dbh->prepare($sql); $stmt->bindValue(1, $question1, PDO::PARAM_INT); $stmt->bindValue(2, $question2, PDO::PARAM_INT); $stmt->bindValue(3, $question3, PDO::PARAM_INT); $stmt->execute(); } catch (PDOException $e) { echo '<div>えらー:' , e.getMessage() , "</div>\n"; } /* 最後に接続を切る */ $stmt = null; $dbh = null;
その他の回答 (1)
- mpro-gram
- ベストアンサー率74% (170/228)
まずは、エラーが出てないかを表示するところから始めるべき。 先頭で error_reporting(-1); としておくとよい。 $_POSTの値は、filter_input()を利用して不正なデータが入ってないかチェックすべき。 PDOの接続はSQL発行ごとに毎回つなぎ直すようなことはしない。おなじオブジェクトを使い回す方がよい。 で、データをfetchする前におおもとの $dbh を null にすると接続情報がキャンセルされて、1行もデータを得てないのでは? あと、sql文のエラーは、PDO接続時に例外発生モードにしてtry{}catch{}しないと知ることはできない。 文字コード設定も set names 発行ではなく、接続時設定で指定するのが最もセキュリティも高いのだが、phpやmysqlはどのversion なのだろうか?
お礼
ご回答ありがとうございます。 ご進言を基にもう一度見直し、改定をしてみます。 MySQLは5.6.20 PHPは5.5.15 です。