-1

データ (テキストおよび HTML 形式) を mysql フィールド LONGTXT に挿入する際に問題があります。ここにエラーがあります

  public 'error' => string '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 ''<p>

Haec subinde Constantius audiens et quaedam referente Thalassio doc' at line 1' (length=226)

エラーでほぼクリア。私は保護のすべての機能を使用しました (エンコード形式、引用符、html の無効化...) 別の方法を考えました。カンマ、セミコロン、スラッシュを扱う 2 つの関数を作成しました。addslashes 関数のコードは次のとおりです。

FUNCTION addText($txt)
    {
        IF(get_magic_quotes_gpc()==false)
                {
                RETURN utf8_encode(addslashes($txt));
                }else{
                RETURN utf8_encode($txt);
                }

    }

保護コンマ機能:

FUNCTION protect_virgules($txt)
    {
        IF($txt!='')
        {
            $x = strlen($txt);
            $newTxt = '';
            FOR($i=0;$i<=$x;$i++)
            {
                    IF($txt[$i]==',' || $txt[$i] == ';')
                    {

                        $newTxt.= '\\'.$txt[$i];
                    }
                    else
                    {
                        $newTxt.=$txt[$i];
                    }
            }
            RETURN htmlentities($newTxt);               
        }
        else
        RETURN '0';
    }

PHP 関数を挿入します。

 public function insert($table,$data){  

    $this->last_insert_id = NULL;

    $fields = "";
    $values = "";
    foreach($data as $fld => $val){
        $values .= trim($this -> escape($val)).",";
         $fields .= $fld.",";

    }
    $values = '"'.substr($values,0,strlen($values)-1).'"';
    $fields = '"'.substr($fields,0,strlen($fields)-1).'"';
    $tab=array($this->escape($table),$fields,$values,"@last_id");
    $this->CALL_SP("sp_insert",$tab);
    if ( $result = mysqli_query( $this->linkId, "SELECT @last_id AS last_inserted_id" ) ) {
        while ($row = mysqli_fetch_assoc($result))
        {
            $this->last_insert_id = $row['last_inserted_id'];
        }
    }

    return  $this->queryId;
}

SQL proc コードを挿入します。

     BEGIN
 SET @stmt_sql=CONCAT("INSERT INTO ", tableName, "  (",fields,")VALUES(", param ,")");
 PREPARE stmt FROM @stmt_sql;
 EXECUTE stmt;
 DEALLOCATE PREPARE stmt;
 SELECT LAST_INSERT_ID() into last_id;
END

構文エラーはいつも喉をつかみます。私を手伝ってくれますか ?

4

1 に答える 1

3

utf8_encode文字列を Latin-1 から UTF-8 に変換する場合を除き、しないでください。魔法の引用符を使用したり、それに依存したり
しないでください。addslashes魔法の引用符をオフにするか、オフstripslashesにできない場合はそれらの効果を元に戻すために使用します。特別な理由がない限り、手動で単一の文字を置き換えたりエスケープ
したりしないでください。

データベースに適したエスケープ メカニズムを使用して、一度エスケープしてください。を使用している場合mysql_*(もう使用しないでください)、 を使用してmysql_real_escape_stringください。mysqli_*を使用している場合は、mysqli_real_escape_stringまたはさらに準備されたステートメントを使用してください。PDO を使用している場合は、準備済みステートメントを使用します。

The Great Escapism (テキスト内のテキストを操作するために知っておくべきこと)を参照して、トピックのより詳細な議論を行ってください。

現在の「準備されたステートメント」は、クエリを値からまったく分離していないため、役に立ちません。いつものようにすべての値を連結してから、準備されたステートメントを一度に強制します。また、ストアド プロシージャも必要ありません。これはすべて、クライアント側 API を使用してより適切に行うことができます。

そう:

  1. マニュアルで説明されているように、マジック クォートを無効にします。
  2. マニュアルで説明されているように、準備済みステートメントを使用します。
  3. マニュアルで説明されているようにmysqli::insert_id、最後の挿入 ID を取得するために使用します。
  4. 4はありません。
于 2012-11-01T14:53:07.333 に答える