在基于PDO的查询中清理表单输入

时间:2013-03-31 02:27:20

标签: php forms web pdo

我一直在试图解决与代码似乎已被弃用的问题相关的问题。

使用Vikram Vaswani的“PHP:A Beginner's Guide”中的示例,目标是验证并正确地从用户的Web表单中转义输入以进入SQLite表。我咨询了许多来源,这些来源都指向我使用如下语法:

条件块中的

$todo->prepare($_POST['name']),它将结果分配给变量,以便在最终查询中用于插入数据库表。无论我做了什么,我能得到的最好结果是NULL。最糟糕的是无法执行查询。

如果这是一个重复的问题,我已阅读本手册并道歉,但可能存在与我不知道的PDO库相关的Microsoft Windows特定问题。我一直无法快速。

表单字段如下:

与日期相关的三个字段:'dd','mm'和'yyyy'。

每次似乎失败的代码如下:

 try {

// If form submitted
// attempt database connection.

$toDo = new PDO('sqlite:todo.db') OR
exit("Could not open database.");

// Check and sanitize input.

$name = !empty($_POST['name']) ? $name = $toDo->prepare($_POST['name']) :
exit('ERROR: Task name is required.');

$dd = !empty($_POST['dd']) ? $dd = (int) $_POST['dd'] :
exit('ERROR: Task due date is required.');

    $mm = !empty($_POST['mm']) ? $mm = (int) $_POST['mm'] :
exit('ERROR: Task due date is required.');

$yyyy = !empty($_POST['yyyy']) ? $yyyy = (int) $_POST['yyyy'] :
exit('ERROR: Task due date is required.');

// Create entry date variable.

$date = checkdate($mm, $dd, $yyyy) ? mktime(0, 0, 0, $mm, $dd, $yyyy) :
exit('ERROR: Task due date is invalid.');

$priority = !empty($_POST['priority']) ?
$priority = $toDo->prepare($_POST['priority']) :
exit('ERROR: Task priority is required.');

// Attempt query execution.
// Add a new record.

$sql = "INSERT INTO tasks (name, due, priority) VALUES
('$name', '$date', '$priority')";

if ($toDo->prepare(exec($sql) == TRUE)) {

     echo "<div id=\"message\">Task record successfully added to database</div>";

}   else {

     echo "ERROR: Could not execute query.";

}

// Close connection to sqlite3.

$toDo = NULL;

 }

 catch(PDOException $e) {

 echo "Exception: " . $e->getMessage();

}   // end catch

我无法在上面的代码中找到任何错误。非常感谢您提供的任何帮助。

1 个答案:

答案 0 :(得分:2)

我认为你的主要问题是这一行:

if ($toDo->prepare(exec($sql) == TRUE)) {

exec()是用于运行命令行程序的PHP函数。我认为你真正想要的是调用PDOStatement::execute方法。

请参阅手册以正确使用PDO::prepare

http://php.net/manual/en/pdo.prepare.php