0

我正在编写一个基本的 CRUD 应用程序来了解情况PHP。我对下面的代码到底在做什么有点困惑。我了解它的一般概念,但我不能 100% 确定其中的逻辑。

我希望有人可以帮助我更好地理解它?

这是我的脚本

    <?php
//Establish connection to db
require_once 'includes/db.php';

//Array for validation
$errors = array();

//Sanitize the fields to ensure db integrity.
$title = filter_input(INPUT_POST, 'title', FILTER_SANITIZE_STRING);
$release_date = filter_input(INPUT_POST, 'release_date', FILTER_SANITIZE_NUMBER_INT);
$publisher = filter_input(INPUT_POST, 'publisher', FILTER_SANITIZE_STRING);
$system = filter_input(INPUT_POST, 'system', FILTER_SANITIZE_STRING);
$rating = filter_input(INPUT_POST, 'rating', FILTER_SANITIZE_NUMBER_INT);
$num_players = filter_input(INPUT_POST, 'num_players', FILTER_SANITIZE_NUMBER_INT);


if($_SERVER['REQUEST_METHOD']=='POST'){

    //Validate the form
    if(empty($title)){
        $errors['title'] = true;
    }
    if(empty($release_date)){
        $errors['release_date'] = true;
    }
    if(empty($publisher)){
        $errors['publisher'] = true;
    }
    if(empty($system)){
        $errors['system'] = true;
    }
    if(empty($rating)){
        $errors['rating'] = true;
    }
    if(empty($num_players)){
        $errors['num_players'] = true;
    }

    //If no errors
    if(empty($errors)){
        //Build SQL Statement
        $sql = $db->prepare("INSERT INTO videogames SET title = :title, release_date = :release_date, publisher = :publisher, system = :system, rating = :rating, num_players = :num_players");
        //Bind values
        $sql -> bindValue(':title', $title, PDO::PARAM_STR);
        $sql -> bindValue(':release_date', $release_date, PDO::PARAM_STR);
        $sql -> bindValue(':publisher', $publisher, PDO::PARAM_STR);
        $sql -> bindValue(':system', $system, PDO::PARAM_STR);
        $sql -> bindValue(':rating', $rating, PDO::PARAM_INT);
        $sql -> bindValue(':num_players', $num_players, PDO::PARAM_INT);

        //Execute SQL
        $sql -> execute();

        //Redirect back to homepage
        header('Location: index.php');
        exit();
    }
}

?>

我对这行代码的作用有点困惑:

$title = filter_input(INPUT_POST, 'title', FILTER_SANITIZE_STRING);

是否将表单输入字段中的值分配给$title变量?

还有这一行:

        $sql -> bindValue(':title', $title, PDO::PARAM_STR);

我在文档中读到这个

将值绑定到用于准备语句的 SQL 语句中的相应命名或问号占位符。

如果我已经将数据存储在$title变量中,那么还有另一种方法来准备我的SQL语句吗?

我会很感激任何帮助,因为我正在尝试扩展我对 PHP 的了解。非常感谢!

4

1 回答 1

1

问题 1 - filter_input

我对这行代码的作用有点困惑:

$title = filter_input(INPUT_POST, 'title', FILTER_SANITIZE_STRING);

是否将表单输入字段中的值分配给 $title 变量?

是的。

filter_input在 PHP 5 中引入。这行代码所做的就是抓取输入变量($_POST['title']),然后对其应用一个SANITIZE方法,即;“剥离标签,可选择剥离或编码特殊字符。”

问题 2 - bindValue

还有这一行:

$sql -> bindValue(':title', $title, PDO::PARAM_STR);

如果我已经将数据存储在 $title 变量中,那么还有另一种方法来准备我的 SQL 语句吗?

我真的不明白这个问题,但我会尽力而为。

这是一种将值绑定到准备好的查询的PDO方法。实际上,它这样做:

  • 嘿 MySQL,这是我需要你运行的查询
    • 查询这些表
    • 取回这些列
  • MySQL 这样做
  • 嘿 MySQL,还记得我让你运行的那个查询吗?这是过滤结果集的值

您可以在此处阅读有关准备和绑定的更多信息:http: //use-the-index-luke.com/sql/where-clause/bind-parameters

查询的另一种方法prepare是使用mysqli,但逻辑是相同的。


这个问题是一年前提出的。我没有恢复它,OP编辑了他的问题并且它被撞了。无论问题的年龄如何,如果 OP 仍然对答案(通过碰撞)表现出兴趣,我认为回答问题没有任何问题

于 2015-03-13T09:06:07.047 回答