我在将数据(文本和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 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
语法错误总是抓住我的喉咙。 你能帮帮我吗?
答案 0 :(得分:3)
不要 utf8_encode
,除非您想将字符串从Latin-1转换为UTF-8。
不使用addslashes
或依赖魔法引号;如果您无法将其关闭,请关闭魔法引号或使用stripslashes
来反转它们的效果
不要手动替换和转义单个字符,除非您有非常具体的理由。
使用适当的数据库转义机制转义一次。如果您使用的是mysql_*
(请勿再使用它),请使用mysql_real_escape_string
。如果您使用的是mysqli_*
,请使用 预备语句。如果您正在使用PDO,请使用预准备语句。mysqli_real_escape_string
或更好的
有关该主题的更长,更详细的讨论,请参阅The Great Escapism (What you need to know to work with text within text)。
您当前的“预准备语句”是无用的,因为它根本不会将查询与值分开。您只是像往常一样连接所有值,然后一次性强制它们通过准备好的语句。也不需要存储过程,使用客户端API可以做得更好。
所以:
mysqli::insert_id
获取最后一次插入ID as explained in the manual。