Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/254.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MySQL和PHP不插入带有空格或特殊字符的行_Php_Mysql - Fatal编程技术网

MySQL和PHP不插入带有空格或特殊字符的行

MySQL和PHP不插入带有空格或特殊字符的行,php,mysql,Php,Mysql,我有一个Android应用程序,当用户在我的web服务器上搜索部件、我的php文档时,我已经设置好将他们搜索的内容添加到另一个表中,以确定通过该应用程序进行了多少次搜索,当一个字段没有空格时,它会很好地添加到表中,但是如果该字段中有空格或特殊字符,比如破折号,它没有插入表中。我不知道如何让它正常工作,我希望有人能了解我在这里做错了什么。提前感谢大家: PHP代码服务器端MySql数据库 $sql = "INSERT INTO USAGE_STATS (ITEM_NAME, FSC, NIIN,

我有一个Android应用程序,当用户在我的web服务器上搜索部件、我的php文档时,我已经设置好将他们搜索的内容添加到另一个表中,以确定通过该应用程序进行了多少次搜索,当一个字段没有空格时,它会很好地添加到表中,但是如果该字段中有空格或特殊字符,比如破折号,它没有插入表中。我不知道如何让它正常工作,我希望有人能了解我在这里做错了什么。提前感谢大家:

PHP代码服务器端MySql数据库

$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
}
colation设置为utf8\u general\u ci,feilds设置为Text,数据库为MyISAM

编辑: 刚试过另一个部件,完整的部件号是5-86510-53,但当它被插入表中时,DB中的数字正好是-86558


更新编辑:不,这之前没有得到回答,我不是问如何防止SQL注入攻击,我是问我在这里做错了什么。。。。提供建议,让我做准备好的陈述,正是我所寻求的那种建议。我想感谢大家为我指出了正确的方向,但是因为我问了一个关于我做错了什么的问题而贬低我并不是我认为这个网站应该做的事情。。。但再次感谢那些提供了有意义的帮助的人:

首先,不要允许在数据库中插入带有空格和特殊字符的数据,因为这将为任何人进行SQL注入打开大门

为了避免使用带有空格和特殊字符的数据,您可以使用MySQL的内置函数MySQL_real_escape_string,如果您使用的是不带pdo的MySQL,则可以使用此函数


若您使用的是pdo对象,那个么您肯定可以在查询中使用prepare语句,因为prepare语句更安全,并且优化了编写查询的方式,因为它提供了在查询中使用命名参数的优势

这里的基本错误是将非数值数据视为纯数值数据

完整的零件号是5-86510-53,但当它被插入表中时,DB中的零件号正好是-86558。”

那是因为你让数据库计算5减去86510减去53。这是文本数据,而不是数字数据,因此直接插入SQL查询时,需要将其括在引号中


事先准备好的语句以不同的方式解决这个问题。

使用事先准备好的语句。它们将解决所有插入问题,同时保护您免受SQL注入的影响。至少,作为一个文本字段,您需要在$PART_编号周围加上单引号,正如Nick所提到的,要么准备语句,要么使用mysqli_real_escape_字符串来防止SQL注入。没有“或”。使用prepared and bound querys.echo“5-86510-53”| bc-86558,因此在您的示例中,零件号被视为一个数字,然后插入结果。我将GoDaddys php服务与他们的MySql服务一起使用。到目前为止,我还没有使用pdo进行设置。您不需要pdo来使用准备好的语句。你也可以使用MySQLi。转义不是防止SQL注入的正确方法。只使用准备好的语句。这样就没有特殊的角色了,你也不必担心像OP这样的问题。