2017-03-01 5 views
0

Helo。次のINSERT INTOクエリを実行するのに問題があります。 SELECTは正常に動作します。間違いはどこですか?あなたの表の列はクォートすべきではないデータベースに挿入する方法(構文エラー)

Error: SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''id', 'reg_date', 'szoveg') VALUES (NULL, CURDATE(), 'x')' at line 1

$servername = "localhost"; 
$username = "root"; 
$password = "pass"; 
$dbname = "db"; 

try { 
    $conn = new PDO("mysql:host=$servername;dbname=$dbname", $username, $password); 
    $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 
    $stmt = $conn->prepare("SELECT * FROM Notes"); 
    $stmt->execute(); 

    $result = $stmt->setFetchMode(PDO::FETCH_ASSOC); 

if(isset($_POST["szoveg"])){ 
     $query = "INSERT INTO Notes ('id', 'reg_date', 'szoveg') VALUES (NULL, CURDATE(), '".$_POST["szoveg"]."')"; 

     $stmt = $conn->prepare($query); 
     $stmt->execute(); 

} 

+1

**警告**:PDOを使用する場合は、[prepared statements](http://php.net/manual/en/pdo.prepared-statements.php)にプレースホルダ値を使用し、ユーザーデータを別々の引数。このコードでは、潜在的に深刻な[SQLインジェクションのバグ](http://bobby-tables.com/)があります。文字列補間や連結を使用せず、代わりに[prepared statements](http://php.net/manual/en/pdo.prepared-statements.php)を使用し、 '$ _POST'や' $ _GET'データをクエリ。この問題やその他の問題については、[PHP The Right Way](http://www.phptherightway.com/)を参照してください。 – tadman

答えて

-1

単一引用符(')は、SQLのスティリングリテラルを示します。 SQL文SQLインジェクション攻撃に対して脆弱にコードを残しを生成するために、文字列の連結のを使用して

$query = "INSERT INTO Notes (id, reg_date, szoveg) VALUES (NULL, CURDATE(), '".$_POST["szoveg"]."')"; 

必須のコメント:このようなカラム名などの識別子を参照するには、裸の単語を使用する必要があります。 代わりにprepareds statementを使用することを検討する必要があります。

+1

あなたの担当者と、本当にこのようなDupsを閉じている必要があります。 – RiggsFolly

+0

ありがとう、うまくいきます! – sOnt

+0

この修正は、SQL注入ホールを武器化しました。準備された声明についての不安は十分ではありません。 – tadman

-1

PHPは、このエラーメッセージが戻っています。

$query = "INSERT INTO Notes (id, reg_date, szoveg) VALUES (NULL, CURDATE(), '".$_POST["szoveg"]."')"; 
+0

ありがとうございました、今は意図したとおりに動作します。 – sOnt

関連する問題