2017-05-19 9 views
0

私は夢中になるかもしれませんが、私は昨日働いていたコードを誓うと今は動作していません。私はそれがデータベースに挿入されていないことに気付きました。エラーが発生しています:SQL構文にエラーがありますか?それを見つけることができません

You have an error in your SQL syntax; check the manual that corresponds 
    to your MariaDB server version for the right syntax to use near 's', 
    '39866', '9780448438047', 'Miss Spider's Sunny Patch Friends: Fun with Bounc' at line 1 

以下の質問があります。私はエスケープ文字列/プリペアドステートメントを使用していないことを知っていますが、これは単なるローカルホストナンバーcruncherであるためです。

$insert = mysqli_query($connect, "INSERT INTO books 
       (subject, booknum, isbn, title, author, publisher, year, 
        format, mark, hurt, pubprice, srp, avail) VALUES 
       ('$subject', '$booknumber', '$isbn', '$title', '$author', 
        '$publisher', '$year', '$format', '$mark', '$hurt', 
        '$pubprice', '$srp', '$avail')") or die(mysqli_error($connect)); 

それも、その行をコメントアウトし、ちょうどやってのように思える:

$insert1 = mysqli_query($connect, "INSERT INTO books (subject) VALUES 
         ('$subject')") or die(mysqli_error($connect)); 

もエラーにつながります。私はこれはエラーが実際に私のDB接続自体に位置していることを推測している?私が使用しています:

include 'db.php'; 

をしかし、私は言ったように、このアプリケーションは、最後の夜を働いていた:ページの最上部に含まれている

<?php 
$connect = mysqli_connect("localhost", "root", "", "wholesale"); 
if(mysqli_connect_errno()) { 
    echo "Failed to connect. Error: " . mysqli_connect_error(); 
} 

。それ以来変更されているのは、私が覚えている限り、コンピュータの電源を入れ直してxamppを再起動したことだけです。

+2

ミス・スパイダーの後に単一引用符が問題 – Steve

+0

である、あなたの価値の一部は、単一引用符を持っているようだということ。 dbに一重引用符を挿入すると、適切にエスケープする必要があります。あなたがSQLインジェクションを避けるためにユーザーデータを扱うときに準備されたステートメントまたはpdoを使用しようとします。 – JYoThI

+0

あなたのコードはSQLインジェクションの影響を受けやすいです。パラメータ化されたクエリを使用してください。 https://stackoverflow.com/questions/60174/how-can-i-prevent-sql-injection-in-php/60496#60496 –

答えて

0

この部分の判断to use near 's', '39866',$subjectに含まれる値には一重引用符が含まれていると仮定しています。たとえば、「これは単語です」ということができます。これがエラーの原因です。あなたはそれらをエスケープするか(mysqli_real_escape_string()または同様のものを使用して)、またはprepared statementを使用する必要があります。

+0

Ahh参照、それは完璧な意味があります。私はこれをテストします。ありがとうございました。 –

-1

入力を消毒する必要があります。挿入する場合はhtmlentities、データベースを選択する場合はhtml_entity_decodeを使用してください。

$subject = htmlentities($subject); 
$booknumber = htmlentities($booknumber); //and etc. 

    $insert = mysqli_query($connect, "INSERT INTO books (subject, booknum, isbn, title, author, publisher, year, format, mark, hurt, pubprice, srp, avail) VALUES ('$subject', 'htmlentities($booknumber', '$isbn', '$title', '$author', '$publisher', '$year', '$format', '$mark', '$hurt', '$pubprice', '$srp', '$avail')") or die(mysqli_error($connect)); 
0

あなたはすぐにあなたがデータを挿入している方法を再考する必要があります。このエラーは、この値に問題があることを示します。

'Miss Spider's Sunny Patch Friends: Fun with Bounc'

ここで、書籍のタイトルのアポストロフィはSQLクエリを壊しています。これは、問題を変更する予期しない値ですが、より大きな問題を指しています。あなたは単に最初に値を逃すことができますが、それは深刻な問題であるものを覆い隠すでしょう。あなたのコードはSQLインジェクションが可能です。

かわりに、パラメータ化クエリを使用する必要があります:How can I prevent SQL injection in PHP?

関連する問題