6

我正在为一所大学的财政援助办公室做一个学校项目。该项目正在生产中,除了这里和那里的一些小调整外,大部分工作已经完成。我对寒假(现在)的主要关注是安全和尽我所能防止任何违规行为。人们告诉我要转向准备好的陈述。除了插入数据外,我在很大程度上理解它们。

我有两种形式:登录表单和学生登录表单。学生登录表单输入学生来办公室的原因。然后提交该表格,然后通过一个表格检索该数据,该表格向辅导员显示学生正在等待看到的内容。

我的问题是,虽然每个走进经济援助办公室的学生都有自己独特的问题(大部分时间),但现在让我感到困惑的是:

我是否需要提前考虑并预先进行插入查询,或者是否有办法进行“动态”查询,因为有一个学生评论框,并且它是完全独一无二的,所以我将如何创建一个查询?

<?php
define('DB_Name', 'dbtest');
define('DB_User', 'root');
define('DB_Password', 'testdbpass');
define('DB_Host', 'localhost');

$link = mysql_connect(DB_Host, DB_User, DB_Password);

if (!$link) {
  die ('Could Not Connect: ' . mysql_error ());
}

$db_selected = mysql_select_db(DB_Name, $link);

if (!db_selected) {
  die('Can Not Use ' . DB_name . ': ' . mysql_error());
}

$value1 = $_POST ['anum'];
$value2 = $_POST ['first'];
$value3 = $_POST ['last'];
$value4 = $_POST ['why'];
$value5 = $_POST ['comments'];

$sql = "INSERT INTO `dbfinaid` (anum, first, last, why, comments) VALUES ('$value1', '$value2', '$value3', '$value4', '$value5')";

if (!mysql_query($sql)) {
  die('Error : ' . mysql_error());
}

mysql_close();

正如我被告知这样做的那样,我很容易受到 SQL 注入的影响。

任何帮助将不胜感激。谢谢你。

4

2 回答 2

6

一旦你阅读了PHP 的 PDO,你就可以像这样重写你的代码

$dbh = new PDO('mysql:host=localhost;dbname=dbtest', $user, $pass);

try {
  $query = $dbh->prepare("INSERT INTO `dbfinaid` (anum, first, last, why, comments) VALUES (:anum, :first, :last, :why, :comments)");

  $query->bindParam(':anum',     $_POST['anum'],     PDO::PARAM_INT);
  $query->bindParam(':first',    $_POST['first'],    PDO::PARAM_STR);
  $query->bindParam(':last',     $_POST['last'],     PDO::PARAM_STR);
  $query->bindParam(':why',      $_POST['why'],      PDO::PARAM_STR);
  $query->bindParam(':comments', $_POST['comments'], PDO::PARAM_STR);

  $query->execute();
}
catch (PDOException $e) {
  die("error occured:" . $e->getMessage());
}
于 2012-12-21T17:16:39.230 回答
5

基于@maček 的答案,这是做同样事情的另一种方法。我觉得这更容易:

$dbh = new PDO('mysql:host=localhost;dbname=dbtest', $user, $pass);

try {
  $query = $dbh->prepare("INSERT INTO `dbfinaid` (anum, first, last, why, comments)
    VALUES (:anum, :first, :last, :why, :comments)");

  $params = array_intersect_key($_POST, array_flip(array('anum', 'first', 'last', 'why', 'comments')));
  $query->execute($params);
}
catch (PDOException $e) {
  error_log($e->getMessage());
  die("An error occurred, contact the site administrator.");
}

我更喜欢将 SQL 错误输出到日志,并向用户显示不同的错误,不会将它们与代码细节混淆。

于 2012-12-21T17:28:51.873 回答