プロが教える店舗&オフィスのセキュリティ対策術

簡単な掲示板を作っています。
ユーザーに入力された値をバインドしprepare、exce等をし最後にfetchArray()で出力したいのですが、エラーが出てしまいうまくできません。
方法を教えてください。

エラー
Warning: SQLite3::prepare(): Unable to prepare statement: 1, near "15": syntax error in

Uncaught Error: Call to a member function bindValue() on null in

コード
$name=$_POST['name'];

$main=$_POST['main'];

// 書き込み日時を取得
$now = date("Y/m/d H:i:s");
$db = new SQLite3("test.db");

$sql = "INSERT INTO tablename(view_name,message,post_date) VALUES(:name,:main,$now)";

$db->prepare($sql);

$res->bindValue(':name',$name,SQLITE3_TEXT);

$res->bindValue(':main',$main,SQLITE3_TEXT);

$res->execute();

$sql="SELECT * FROM tablename";
$res = $db->query($sql);
while( $row = $res->fetchArray() ) {
echo '<ul> ' . ' <li> '.$row[0].'</li>'. ' <li> '.$row[1].'</li>'.
' <li> '.$row[2].'</li>'. ' <li> '.$row[3].'</li>'. ' <li> '.$row[4].'</li>'.
'</ul>';}

A 回答 (2件)

>"INSERT INTO tablename(view_name,message,post_date) VALUES(:name,:main,$now)";



文字列内に時刻を直接埋め込んでいるので、SQL文法エラーを起こしてるのでしょう。
post_dateの値もプレイスホルダー経由でバインドしてあげるとよいかと。view_nameやmessageもそうしてるのですから。
    • good
    • 0
この回答へのお礼

ありがとうございました。

お礼日時:2021/03/04 19:11

1. SQLite3::prepare の戻り値を正しく使いましょう


https://www.php.net/manual/ja/sqlite3.prepare.php

2. SQL 文法違反しているので $now も bindValue で渡しましょう
https://www.php.net/manual/ja/sqlite3stmt.bindva …

3. 保守性の観点から SELECT 対象は "*" でなく列名を列挙しましょう

4. スクリプト注入の危険を避けるため $row[?] はエスケープして表示しましょう
https://www.ipa.go.jp/security/awareness/vendor/ …
https://www.php.net/manual/ja/function.htmlspeci …
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!