1. ホーム
  2. php

[解決済み] MySQLサーバのバージョンに対応するマニュアルをチェックして、2行目の ''''' の近くで使用する正しい構文を確認してください。

2022-01-31 16:11:22

質問

MySQLでエラーが発生します。

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 '''')' at line 2'.

HTMLコードです。

<form action="read_message.php" method="post">
  <table class="form_table">
    <tr>
      <td style="font-weight:bold;">Subject:</td>
      <td><input style=" width:300px" name="form_subject"/></td>
      <td></td>
    </tr>
    <tr>
      <td style="font-weight:bold;">Message:</td>
      <td id="myWordCount">&nbsp;(300 words left)</td>
      <td></td>
    </tr>
    <tr>
      <td><input type="hidden" name="sender_id" value="<?php echo $sender_id?>"></td>
      <td><textarea cols="50" rows="4" name="form_message"></textarea></td>
      <td valign="bottom"><input type="submit" name="submit_message" value="send"></td>
    </tr>
  </table>
</form>

mysqlのテーブルに挿入するためのコード。

<?php
  include_once"connect_to_mysql.php";
  //submit new message
  if($_POST['submit_message']){

    if($_POST['form_subject']==""){
      $submit_subject="(no subject)";
    }else{
      $submit_subject=$_POST['form_subject'];   
    }
    $submit_message=$_POST['form_message'];
    $sender_id = $_POST['sender_id'];
    if($shortMessagesLeft<1){
      $form_error_message='You have left with '.$shortMessagesLeft.' Short Message. Please purchase it from the <a href="membership.php?id='.$id.'">shop</a>.';
    }
    else if($submit_message==""){
      $form_error_message = 'Please fill in the message before sending.';
    }
    else{
      $message_left = $shortMessagesLeft-1;
      $update_short_message = mysql_query("UPDATE message_count SET short_message = '$message_left' WHERE user_id = '$id'");
      $sql = mysql_query("INSERT INTO private_messages (to_id, from_id, time_sent, subject, message) 
        VALUES('$sender_id', '$id', now(),'$submit_subject','$submit_message')") or die (mysql_error());
    }
  }

?>

このエラーの意味と私のやり方は間違っているのでしょうか?

どうすればいいですか?

の中にシングルクォートがあります。 $submitsubject または $submit_message

なぜこれが問題なのでしょうか?

MySQLではシングルクォートで文字列を終了させ、それ以降はSQLコマンドとして扱われます。あなたは REALLY このようなSQLの書き方はしないでください。よくて、アプリケーションが断続的に壊れる(あなたが観察しているように)だけでなく、最悪の場合、あなたは巨大なセキュリティの脆弱性を導入してしまったことになるのです。

もし、誰かが '); DROP TABLE private_messages; を送信メッセージに含めることができます。

あなたのSQLコマンドは、次のようになります。

INSERT INTO private_messages (to_id, from_id, time_sent, subject, message) 
        VALUES('sender_id', 'id', now(),'subjet','');

DROP TABLE private_messages;

その代わり、値を適切にサニタイズする必要があります。

最低限、各値を mysql_real_escape_string() しかし、本当はプリペアド・ステートメントを使うべきでしょう。

を使用していた場合 mysql_real_escape_string() のようなコードになります。

if($_POST['submit_message']){

if($_POST['form_subject']==""){
    $submit_subject="(no subject)";
}else{
    $submit_subject=mysql_real_escape_string($_POST['form_subject']); 
}
$submit_message=mysql_real_escape_string($_POST['form_message']);
$sender_id = mysql_real_escape_string($_POST['sender_id']);

以下は 名品 プリペアドステートメントとPDOについて。