我有一个我编写的Android应用,当用户搜索零件时,我的Web服务器上的php文档已设置为将他们搜索的内容添加到另一张表中,以解决通过该应用进行的搜索次数。字段没有空格,可以很好地添加到表中,但是,如果字段中有空格或特殊字符(如破折号),则不会插入到表中。我不知如何使它正常工作,我希望有人可能对我在这里做错的事情有所了解。谢谢大家:)
PHP代码服务器端(MySql DB)
$sql = "INSERT INTO USAGE_STATS (ITEM_NAME, FSC, NIIN, PART_NUMBER)
VALUES ('$ITEM_NAME', '$FSC', '$NIIN', $PART_NUMBER)";
if ($conn->query($sql) === TRUE) {
$row = mysqli_insert_id($conn);
} else {
//do nothing
}
排序规则设置为“ utf8_general_ci”,字段设置为“文本”,日期数据库为MyISAM
编辑: 刚刚尝试了另一部分,完整的部分号是“ 5-86510-53”,但是当它插入表中时,它刚出现在数据库中的“ -86558”
更新编辑:不,以前没有回答,我不是在问如何防止SQL注入攻击,我是在问我做错了什么......提供建议,建议我应该做准备好的语句我正在寻找的建议。我要感谢每个人为我指明了正确的方向,但是因为我提出了关于我做错了什么的问题而使我失望,这并不是我认为本网站应该引起的...但是再次感谢那些提供有意义的帮助:)
答案 0 :(得分:1)
这里的基本错误是将非数字数据视为纯数字。
完整的零件号是“ 5-86510-53”,但是当它插入表中时,它刚出现在DB中的“ -86558””
那是因为您告诉数据库进行计算 5减86510减53。这是文本数据,而不是数字数据,因此在插入SQL查询时需要用引号引起来直接。
https://dev.mysql.com/doc/refman/8.0/en/string-literals.html
(准备好的语句以不同的方式解决了这个问题。)
答案 1 :(得分:0)
首先,不允许在数据库中插入带有空格和特殊字符的数据,因为它将为任何人进行SQL注入打开大门,
为避免带有空格和特殊字符的数据,可以使用MySQL_real_escape_string,这是MySQL的内置函数,如果使用不带pdo的MySQL,则可以使用此函数。
如果您使用的是pdo对象,则可以肯定地使用prepare语句进行查询,因为prepare语句更安全,并且可以优化编写查询的方式,因为它提供了在查询中使用命名参数的优势。