-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......)我想到了另一种方法,我创建了两个处理逗号,分号和斜杠的函数下面是函数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 过程代码:

     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 回答