Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/275.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/66.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
Php SQL插入错误似乎停止了中间字符串_Php_Mysql - Fatal编程技术网

Php SQL插入错误似乎停止了中间字符串

Php SQL插入错误似乎停止了中间字符串,php,mysql,Php,Mysql,我有这个代码要插入数据库。由于某种原因,它在第三个参数上被破坏。如果我把它拿出来,另外两个就可以了 我也知道它应该是mysqli,我正在使用旧代码,只是想让这部分正常工作。稍后将解决更新问题 echo $_SESSION['test']['categoryname']; $result = mysql_query('INSERT INTO '.$db_table_prefix.'saved_tests (user, category, categoryname) VALUES ('. $user

我有这个代码要插入数据库。由于某种原因,它在第三个参数上被破坏。如果我把它拿出来,另外两个就可以了

我也知道它应该是mysqli,我正在使用旧代码,只是想让这部分正常工作。稍后将解决更新问题

echo $_SESSION['test']['categoryname'];
$result = mysql_query('INSERT INTO '.$db_table_prefix.'saved_tests (user, category, categoryname) VALUES ('. $user["id"] .','. $_SESSION["test"]["category"] .','. $_SESSION["test"]["categoryname"] .')', $db_connection); 
这将在页面上输出:

气道呼吸与通气

插入data1064失败:SQL语法中有错误;检查与MySQL服务器版本对应的手册,了解第1行“呼吸和通风”附近使用的正确语法


我似乎弄不明白问题出在哪里。您可以看到打印变量会显示完整的字符串。

您需要在包含字符串的值周围加引号

$result = mysql_query('INSERT INTO '.$db_table_prefix.'saved_tests (user, category, categoryname) 
    VALUES ('. $user["id"] .','. $_SESSION["test"]["category"] .',
            "'. mysql_real_escape_string($_SESSION["test"]["categoryname"]) .'")', $db_connection); 
如果
$\u会话[“test”][“category”]
也包含一个字符串,您也需要在其中加引号

您还应该使用
mysql\u real\u escape\u string()
来防止SQL注入。

$\u会话[“test”][“category”]
$\u会话[“test”][“categoryname”]
都是字符串。您需要使用quote

mysql_query('INSERT INTO '.$db_table_prefix.'saved_tests (user, category, categoryname) VALUES ('. $user["id"] .',"'. $_SESSION["test"]["category"] .'","'. $_SESSION["test"]["categoryname"] .'")', $db_connection);

您并不是在避免SQL注入。而是使用参数化查询。请考虑使用PDO。PDO将在12个不同的数据库系统上工作,而MySQLi将只在MySQL数据库上工作。

在字符串表示的值中添加单引号

  • 通常,日期和字符串值应包含在单引号和
  • 数值不需要用引号括起来
例如,通过使用一些中间变量使查询字符串更简单,也可以像这样使代码更简单-

$db_table_prefix = 'tst';// table prefix goes here
$category = $_SESSION["test"]["category"];  //category goes here;
$categoryname = $_SESSION["test"]["categoryname"]; //category name goes here
$user_id = $user['id']; //700
$query = "INSERT INTO $db_table_prefix.saved_tests (user, category, categoryname) VALUES ('$user_id','$category','$categoryname')"; 
$result = mysql_query($query,$db_connection);

<强> N.B.<强>还考虑如何使用类似.

更新的方法来防止SQL注入-甚至仅用于此语句-并且使用准备好的语句既能解决您的问题,又能解决目前的SQL注入问题。它不是中段结束,它只是告诉你问题在哪里。由于mysql_*函数在PHP7.0.0中已被弃用和删除,因此您需要将查询切换为使用或。使用预先准备好的语句和参数绑定,您就再也不用担心引用问题了。。。“知善即行善”——Socrates可能与+1重复所有关于引用的答案都是正确的,但我已经通过中间变量提高了这一答案的可读性;可读性本身就是一种美德,当所需的引语缺失时,它可以是明确的东西;当然,所有关于参数绑定的评论都比引用要好,但是,在使用参数绑定时,这种可读性改进也会有所帮助。虽然您的答案似乎是唯一一个真正反对SQL注入的答案,但我不能对此进行反驳,因为它仍然使用从PHP中删除的扩展。如果我们想摆脱像这样的问题,那么我们需要将它们作为重复项关闭,并且不要回答它们。以前有很多这样的问题。根本原因是一样的,没有使用预先准备好的语句。@Dharman问题是他不能升级。我很同情,我的站点有数百个使用mysql扩展编写的脚本,我们没有资源重写它们。当我们升级到PHP7.x时,我们安装了一个垫片。