Php SQL插入错误似乎停止了中间字符串
我有这个代码要插入数据库。由于某种原因,它在第三个参数上被破坏。如果我把它拿出来,另外两个就可以了 我也知道它应该是mysqli,我正在使用旧代码,只是想让这部分正常工作。稍后将解决更新问题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
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时,我们安装了一个垫片。