【问题标题】:Sanitizing Form Input in PDO-based Query在基于 PDO 的查询中清理表单输入
【发布时间】:2013-03-21 11:34:06
【问题描述】:

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

使用 Vikram Vaswani 的“PHP:初学者指南”中的一个示例,目标是验证并正确转义用户 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

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

【问题讨论】:

    标签: php forms web pdo


    【解决方案1】:

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

    if ($toDo-&gt;prepare(exec($sql) == TRUE)) {

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

    PDO::prepare的正确用法参见手册:

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

    【讨论】:

    • 感谢您提供此信息。不幸的是,我似乎仍然面临错误。这次再来一个。我修改后的代码是:
    • 感谢您提供此信息。不幸的是,我似乎仍然面临错误。这次再来一个。我修改后的代码如下: if ($toDo->execute($sql) == TRUE) 这会产生以下错误: bool(false) 致命错误:在 I:\Web 中调用未定义的方法 PDO::execute() \Apache2\htdocs\web_programming_pages\php_beginner\chapter_7\projects\save.php 在第 102 行
    • 您需要在从 PDO::prepare 返回的 PDOStatement 实例上调用 execute(),而不是在原始 PDO 实例上调用。开始一个新文件并从手册中逐步构建示例,以了解它是如何工作的,就这一点而言,忘记您正在阅读的书,因为它显然会让您感到困惑。
    • 澄清一下:你需要做这样的事情: $statement = $toDo->prepare($sql); $statement->execute();
    • 感谢您的额外帮助。我已经勇敢地尝试过,包括查看 PHP 手册,但仍然遇到问题。我修改后的代码是: $pdoStatement = $toDo->prepare($sql); if ($pdoStatement->execute() == TRUE) {... 现在,当我有一个“危险”字符串时,我收到以下消息: string(20) "See Finian's Rainbow" 致命错误:调用成员函数在第 103 行的 I:\Web\Apache2\htdocs\web_programming_pages\php_beginner\chapter_7\projects\save.php 中的非对象上执行()。
    猜你喜欢
    • 2017-01-16
    • 2016-02-25
    • 1970-01-01
    • 2012-10-02
    • 1970-01-01
    • 1970-01-01
    • 2018-11-23
    • 2011-05-20
    • 1970-01-01
    相关资源
    最近更新 更多