0

我可能缺少一些基本的东西,所以在这一点上,我只需要第二双眼睛。我正在我的网站上构建一个简单的输入表单,以便访问者可以提交一些信息。现在,我只是称他们为工作(我只是想让它工作)。当我点击提交时,我在 PHPMYadmin 端没有看到任何信息,因此 SQL 数据库显然没有被更新。我第一次没有说这很糟糕。

另外,出于安全原因,我的密码是隐藏的,但它是正确的。

这是我的 PHP 和我的 HTML。

<?php
$con = mysql_connect("localhost","projedl8_Jason","/////");
if (!$con)
{
    die('Could not connect: ' . mysql_error());
}

mysql_select_db("projedl8_quicktern", $con);

$sql="INSERT INTO jobListForm (NAME, Email, JobTitle, JobDescription)
            VALUES ('JASON', '$_POST[email]','$_POST[job_title]','$_POST[job_description]')";

if (!mysql_query($sql,$con))
  {
      die('Error: ' . mysql_error());
  }
echo "1 record added";

                        mysql_close($con);
?>

最后:

  <form name="submitjobform" method="post" action="job_submit.php">
    <table width="450px">
    <tr>
     <td valign="top">
      <label for="name">Name</label>
     </td>
     <td valign="top">
      <input  type="text" name="first_name" maxlength="100" size="30">
     </td>
    </tr>
    <tr>
     <td valign="top">
      <label for="email">Email Address</label>
     </td>
    <td valign="top">
      <input  type="text" name="email" maxlength="80" size="30">
    </td>
    </tr>
   <tr>
    <td valign="top">
     <label for="job_title">Job Title</label>
    </td>
    <td valign="top">
     <input  type="text" name="job_title" maxlength="30" size="30">
    </td>
    </tr>
    <tr>
     <td valign="top">
      <label for="comments">Job Description</label>
     </td>
     <td valign="top">
      <textarea  name="job_description" maxlength="1000" cols="25" rows="6"></textarea>
    </td>
    </tr>
    <tr>
     <td colspan="2" style="text-align:left">
     <input type="submit" name="submit" value="Submit" size="100"></td>
    </tr>
    </table>
    </form>

这是 PHPMYADMIN 的屏幕截图

在此处输入链接描述

4

2 回答 2

1

我认为这可能是里面缺少的单引号$_POST[...]

但是,您的解决方案对SQL 注入是开放的,因此最好使用准备好的语句,处理引号/反斜杠,在参数中转义。

    $db = new mysqli($dbserver, $dbusername, $dbpassword, $dbdatabase);
    $stmt2 = $db->stmt_init();
    if (!$stmt2->prepare("INSERT INTO jobListForm (NAME, Email, JobTitle, JobDescription)
        VALUES (?, ?, ?, ?)")) {
        die('Error');
    } else {
        $stmt2->bind_param('ssss', 'JASON', $_POST['email'], $_POST['job_title'], $_POST['job_description']);
        if (!$stmt2->execute()) {
            die;
        } else {
            $id = mysqli_insert_id($db);
        }
    }
    $stmt2->close();

(四个 ssss 表示每个参数都是一个字符串。)

于 2012-07-08T22:15:13.233 回答
0

我假设您的问题只是“mysql 无法连接”部分(我还假设 '////' 是该字段的正确值)

尝试用“127.0.0.1”或内部网络接口的 IP 替换“localhost”,以防连接不是通过 Unix 套接字发生的。

但是,您的代码有一个非常糟糕的 SQL 注入漏洞案例,在这种形式和使用 MySQL 时相对无害(它是 INSERT 形式,MySQL 不允许执行多个语句,所以发布

email=','',''); DROP TABLE jobListForm; --

将导致

INSERT INTO jobListForm (NAME, Email, JobTitle, JobDescription)
        VALUES ('JASON', '','',''); DROP TABLE jobListForm; --','','');

被传递给 MySQL,并且只有第一个查询 INSERT 会执行。

但是,在其他地方,这可能允许 SELECT...LOGIN 查询返回 TRUE 和管理员记录,即使提交的密码错误,也允许任何人管理您的系统。

将准备好的语句与 PDO 一起使用,或彻底验证 POST 中发送的内容。

于 2012-07-08T22:00:50.333 回答