4

これが私のコードです:

<?php
$con = mysql_connect("localhost","solidarity","password");
if (!$con)
  {
  die('Could not connect: ' . mysql_error());
  }

mysql_select_db("database", $con);

$sql="INSERT INTO show_reviews (username, date, content, show) VALUES (".addslashes($_POST[username]).",".addslashes($_POST[date]).",".addslashes($_POST[content]).",".addslashes($_POST[show]).")";

if (!mysql_query($sql,$con))
  {
  die('Error: ' . mysql_error());
  }
echo "1 record added";

mysql_close($con);
?>

だから私はfsprintを使用し、今はw3schoolsコードを使用しました。これは、両方のコードを使用した出力です。

エラー:SQL構文にエラーがあります。1行目の「show)VALUES(Solidarity、17:02-Wed、1st Aug 2012、Testing、kr1971)」の近くで使用する正しい構文については、MySQLサーバーのバージョンに対応するマニュアルを確認してください。

コメントシステムに非常によく似た構文を使用していますが、この問題はありません。それも役立つ場合は、ローカルのSQLサーバーとリモートでも試してみましたが、まだ運がありません。

私を助けてください :(。

4

6 に答える 6

9

値を一重引用符で囲みます。

$sql=" INSERT INTO show_reviews (username, date, content, show) 
       VALUES ('".addslashes($_POST[username])."','".addslashes($_POST[date])."','".addslashes($_POST[content])."','".addslashes($_POST[show])."')";

さらに、他の人が言っているように、showはMySQLの予約キーワードです。MySQL 5.5の予約キーワードの完全なリストは、http://dev.mysql.com/doc/refman/5.5/en/reserved-words.htmlで確認できます。

予約語を使用できるようにするには、バッククォートを使用して予約語を引用できます。

INSERT INTO show_reviews (username, date, content, `show`)

識別子の引用:http: //dev.mysql.com/doc/refman/5.5/en/identifiers.html

addslashes()そして最後に、エスケープに使用することについてのコメントを要約します。なぜそれが悪いのかをChrisShiflettに説明させます:http ://shiflett.org/blog/2006/jan/addslashes-versus-mysql-real-escape-string

PDOまたは少なくともMySQLiを使用して、プリペアドステートメント/パラメーター化されたクエリの時流に乗る必要があります。クエリがどのように見えるかの例を次に示します。

$dbh = new PDO($connection_string);
$sql = "INSERT INTO show_reviews (username, date, content, show) VALUES (?, ?, ?, ?)"; 
$stmt = $dbh->prepare($sql);
$stmt->execute(array($_POST['username'],
                    $_POST['date'],
                    $_POST['content'],
                    $_POST['show']
));
while ($row = $stmt->fetch()) {
   print_r($row);
}

これは単なる例であり、$ _ POST変数のサニタイズを行い、受け取ったデータが正確に取得しようとしていたものであることを確認するために最善を尽くすことは依然として良い考えです。これらのプリペアドステートメントは、適切にエスケープし、PDOを使用している場合は、特定のデータベースエンジンに適切な方法でエスケープします。

于 2012-08-01T16:28:30.187 に答える
4

showmysqlキーワードです。したがって、列名にすることはできません。showを列名として使用する場合は、エスケープする必要があります。

于 2012-08-01T16:28:28.307 に答える
4

showSQLで予約されているキーワードです。列名として使用するには、バッククォートで囲む必要があります。

于 2012-08-01T16:28:36.903 に答える
1

このクエリを使用してください

$sql= 'INSERT INTO show_reviews (username, date, content, show) 
       VALUES ("'.addslashes($_POST[username]).'",".'addslashes($_POST[date]).'","'.addslashes($_POST[content]).'","'.addslashes($_POST[show]).'")';
于 2012-08-01T16:29:25.463 に答える
0

値は引用符で囲む必要があります。

$sql="INSERT INTO show_reviews (username, date, content, show) VALUES ('".addslashes($_POST[username])."','".addslashes($_POST[date])."','".addslashes($_POST[content])."','".addslashes($_POST[show])."')";

また、showは予約語なので、バックティックで囲む必要があります。

于 2012-08-01T16:29:27.280 に答える
0

セバスチャンのコメントを詳しく説明するには、PDOを使用します。SQLインジェクション攻撃に対してより回復力があります(または耐性がありますか?)。コードは次のようになります

<?php

try {
    $handle = new PDO('mysql:host=localhost;dbname=myDatabaseName', 'username','password');

    $prepared = $handle->prepare("INSERT INTO show_reviews (username, date, content, show) VALUES (?,?,?,?)");

    if($prepared->execute(array($_POST['username'], $_POST['date'], $_POST['content'], $_POST['show']))) {
    echo "1 record inserted...";
    }else {        
        echo "insert failed...";
    }    
}catch(PDOException $ex) {
    // error connecting to database
}
?>
于 2012-08-01T17:00:11.867 に答える