提交时获取IP,SQL语法错误


Grabbing IP on submit, SQL syntax error

浏览谷歌几个小时后,我设法拼接了一些代码,看起来大部分都在工作。不幸的是,我在提交表单时遇到了SQL错误。

我想做的是:当有人在我的网站上填写表格时,会根据表格中按下的单选按钮应用一个特定的功能。我想将数据存储在数据库中,但我也想存储提交个人的IP地址。

我对这个很棒的社区所要求的只是解释为什么它没有像我认为的那样发挥作用,以及如何防止这种情况再次发生的快速课程。

这是我表格的代码:

<html>
<head>
<link rel="stylesheet" type="text/css" href="/style.css">
    <title> 
    Learning Made Easy
    </title>
</head>
<body>
    <?php include_once 'googleanalytics.php'; ?>
<a href="http://terrythetutor.com">
    <div class="banner"> </div>
</a>
<?php include 'menu.php'; ?>
<div class="content">
</br>
</br>
</br>
    <form action="../scripts/switch.php" method="post">
    Title: 
    </br><input type="text" name="Title">
</br>
</br>
</br>
    Summary of the video (including questions used in the video): 
    </br><textarea name="Summary" COLS=60 ROWS=10></textarea>
</br>
</br>
</br>
    URL of the video (Yes, this means you need to upload it to an external website.): 
    </br><input type="text" name="URL">
    </br>
    </br>
    Which course does your video pertain to?</br>
    <input type="radio" name="course" value="intermediate"> Intermediate and below</br>
    <input type="radio" name="course" value="college"> College Algebra</br>
    <input type="radio" name="course" value="precalculus"> PreCalculus</br>
    <input type="radio" name="course" value="trigonometry"> Trigonometry</br>
    <input type="radio" name="course" value="calculus I"> Calculus I</br>
    <input type="radio" name="course" value="calculus II"> Calculus II</br>
    <input type="radio" name="course" value="calculus III"> Calculus III</br>
    <input type="radio" name="course" value="differential equations"> Differential Equations</br>
    </br>

触发的功能用于根据所选单选按钮选择正确的功能。为了篇幅起见,我不会把它包括在内,而是直接跳到它重定向到的代码。这就是(我怀疑)我的错误所在,不幸的是,我不够精通,无法单独解决这个错误。

函数AFTER switch.php的代码(这是我定义IP变量的地方):

<?php
// Create connection
$con=mysqli_connect("********","*****","*****","****");
$IP = $_Server['REMOTE_ADDR'];
// Check connection
if (mysqli_connect_errno($con))
  {
  echo "Failed to connect to MySQL: " . mysqli_connect_error();
  }
  $sql="INSERT INTO Intermediate Algebra ('Title', 'URL', 'IP', 'Summary')
VALUES 
('$_POST[Title]','$_POST[URL]','[$IP]','$_POST[Summary]'";
if (!mysqli_query($con,$sql))
  {
  die('Error: ' . mysqli_error($con));
  }
echo "Your video has been successfully submitted. Thank you for your contribution to TerryTheTutor.com";
header('Location:http://terrythetutor.com');
  ?>
        </br>
        <input type="submit" value="Submit, foo!">
        </form>
    </br>
    </br>
    </br>
    <p>
    Please understand that you will not be able to change the title, summary, or URL of your video after submission.
    </p>

    </div>
    <div class="footer">
        <?php include 'footer.php'; ?>
    </div>

    </body>
    </html>

我认为错误源自$IP变量。我试着添加引号,无数次扫描代码,但仍然不确定错误是什么。

以下是我提交时出现的错误:

Error: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'Algebra ('Title', 'URL', 'IP', 'Summary') VALUES ('Title Test','Url test','[]',' at line 1

出于礼貌,如果有人能向我展示如何正确地"消毒"这些数据输入,那就太好了。

谢谢你们,伙计们!

表名和列名是标识符。它们不是字符串文字,所以不应该用单引号括起来。所以你需要删除它,例如

INSERT INTO `Intermediate Algebra` (Title, URL, IP, Summary) VALUES(....)

如果名称中恰好包含空格或保留关键字,则应使用反引号进行包装。例如

INSERT INTO `Intermediate Algebra` (`Title`, `URL`, `IP`, `Summary`) VALUES(...)

附加信息

  • MySQL保留关键字列表

附带说明一下,如果变量的值(s)来自外部,那么查询就容易受到SQL Injection的攻击。请看下面的文章来了解如何防止它。通过使用PreparedStatements,您可以摆脱在值周围使用单引号的情况。

  • 如何防止PHP中的SQL注入

您可以尝试一下,这将帮助您成功运行脚本,不会出现任何错误。

$sql="INSERT INTO `Intermediate Algebra` (`Title`, `URL`, `IP`, `Summary`) 
VALUES ('".$_POST[Title]."','".$_POST[URL]."','".$IP."','".$_POST[Summary]."')";

这里有多个错误:


PHP变量名区分大小写。这意味着你在这行代码中有一个错误:

$IP = $_Server['REMOTE_ADDR'];

因此,$IP总是空的。

相反,这应该是:

$IP = $_SERVER['REMOTE_ADDR'];

在SQL语句中,带有空格的表名需要后引号。对字段名也这样做也是一个非常好的主意,以避免与MySQL关键字发生冲突:

$sql="INSERT INTO `Intermediate Algebra` (`Title`, `URL`, `IP`, `Summary`) VALUES(...)";

最后,您的SQL语句容易受到SQL注入的攻击,需要完全重写并用准备好的语句替换。

您需要关闭括号)

('$_POST[Title]','$_POST[URL]','$IP','$_POST[Summary]')";

SQL:

    $Title = mysqli_real_escape_string($con, $_POST['Title']);
    $URL = mysqli_real_escape_string($con, $_POST['URL']);
    $IP = $_SERVER['REMOTE_ADDR'];
    $IP = mysqli_real_escape_string($con, $IP);
    $Summary = mysqli_real_escape_string($con, $_POST['Summary']);
    $sql="INSERT INTO Intermediate Algebra ('Title', 'URL', 'IP', 'Summary')
       VALUES
       ('$Title','$URL','$IP','$Summary')";