php - 使用 php 和 mysql 从表单插入数据库表时收到错误

标签 php mysql database mysqli insert

将信息插入我的数据库时遇到问题。收到错误 错误:您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以了解使用near 唯一许可的花园的正确语法。

我已经查找了解决方案,并按照列出的步骤解决了该问题,例如,将 INSRT 语句全部放在一行中以避免空格并更改列名称,但没有运气。我觉得我的代码中缺少了一些东西。相同的 INSRT 语句在我网站上的较小表单上运行良好,但不适用于此表单。

<div id="form">
<form action="sendinvite.php" method="post" class="eventform">
    <fieldset id="createeventform" class="fieldset">
         <legend style="color:#3b817a">Plan Details and Invite your Connections</legend>


   <label>Activity Category:</label>
<input type="text" name="activity_cat" id="aname " value="<?php echo $row['activity_cat']?>"/>
    </br>

<label>Activity Name:</label>
<input type="text" name="activity_name" id="aname " value="<?php echo $row['activity_name']?>"/>
    </br>

<label>Activity Address:</label>    
    <textarea id="aaddress" name="activity_address"><?php echo $row['activity_address']?></textarea>
    </br>

<label>Activity Description:</label>    
<textarea id="adescription" name="activity_description"><?php echo $row['activity_description']?></textarea>
    </br>

<label>Date of Activity:</label>
<input type="text" id="date" data-format="DD-MM-YYYY" data-template="D MMM YYYY" name="date"/>
    </br>

<label>Time of Activity:</label>
<input type="text" id="time" data-format="HH:mm" data-template="HH : mm" name="datetime"/>
</br>

<label>Message to Invitee</label>
<textarea id="comment" name="activity_message"></textarea>
    </br>

<label>Username Address to send</label>
<input type="text" id="username" name="username"/>
</br>
</br>
<input type="submit" name="addconnect" value="Send Invite"/>

</fieldset>

</form>

上面是我的表单,下面是我的 php,要插入到名为 user_invites 的数据库表中

<?php

session_start();


require_once('connect.php');

if (isset($_POST['addconnect']) && isset($_POST['activity_cat']) && isset($_POST['activity_name']) && isset($_POST['activity_address']) && isset($_POST['activity_description']) && isset($_POST['date']) && isset($_POST['datetime']) && isset($_POST['activity_message']) && isset($_POST['username']) ) {

    $sql = "INSERT into `user_invites` (user_id, activity_cat, activity_name, activity_address, activity_description, date, datetime, activity_message, username) VALUES (" . $_SESSION['userSession'] . ",'" . $_POST['activity_cat'] . "','" . $_POST['activity_name'] . "','" . $_POST['activity_address'] . "','" . $_POST['activity_description'] . "','" . $_POST['date'] . "','" . $_POST['datetime'] . "','" . $_POST['activity_message'] . "','" . $_POST['username'] . "')";



if (!mysqli_query($conn,$sql))
{
die('Error: ' . mysqli_error($conn));
}

echo "<p></br>Thank you!</p>
";

mysqli_close($conn);

}

?>
PS。该代码尚未上线,仅用于项目目的。我知道代码存在 SQL 注入(inject)问题

最佳答案

您使用单引号来分隔查询中的值。您的值之一还包含单引号,这会过早结束值分隔符并使查询其余部分的语法无效。

例如,我将您的查询限制为单个字段:

$sql = "INSERT into `user_invites` (activity_description)
        VALUES ('" . $_POST['activity_description'] . "')";
                ^ value start quote                    ^ value end quote

您的错误消息表明唯一获得许可的花园附近出现错误。看看如果有人输入“StackOverflow 唯一许可的花园”的描述会发生什么(就 SQL 而言):

$sql = "INSERT INTO `user_invites` (activity_description)
        VALUES ('StackOverflow's only licensed garden')";
                ^ value start quote
                              ^ value end quote

从“唯一许可的花园”开始的所有内容现在都是无效的 SQL。

@cteski 转义引号的意思是,您不应将用户输入直接放入查询中,因为您需要考虑其中某处存在 ' 的可能性。即使将其更改为双引号,用户也有可能在字段中的某处输入 "。也许它不是 StackOverflow 唯一授权的花园,而是 StackOverflow 是唯一“获得许可的”花园。那么您就会遇到单双引号的麻烦。

您可以通过使用mysqli_real_escape_string()来解决这个问题:

$sql = "INSERT into `user_invites` (activity_description)
        VALUES ('" . mysqli_real_escape_string($conn, $_POST['activity_description']) . "')";

这可以确保值中的任何 '" 都被正确转义并且不会破坏您的查询。是的,您应该对提供的所有值执行此操作由用户创建。名称、地址、消息或任何其他表单字段中也可能有引号。

关于php - 使用 php 和 mysql 从表单插入数据库表时收到错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43668483/

相关文章:

php - 使用 JSONArray 中的值的 Mysql 查询

php - 将 phpcs 修复程序的结果存储到文件中

php - Laravel 授权 : These credentials do not match our records

php - 如何使用德语执行重复性任务

java - 如何防止 APK 中的 Assets 文件被逆向工程

php - Yii 2.0 : 2 database connection

mysql - 我应该如何构建具有松散关系的 SQL 数据库

mysql - 有没有办法使用 RMySQL 调用存储过程?

mysql - 外键似乎没有按预期工作?

java - 数据库插入需要零秒才能插入