首页 > 解决方案 > 尝试使用 PHP 通过表单在数据库中创建条目

问题描述

我只是不知道我要去哪里错了。尝试了多个表,但不成功。

<?php

if(isset($_POST['submit'])){
    // create sql
    $catName = $_POST['category_name'];
    $sql = "INSERT INTO Categories(c_name) VALUES($catName)";
    

    }
if($catName->query($sql) === TRUE) {
    echo "success";
} else {
    echo "error" . $sql . "<br>" . $catName->error;
}
    
?>

<?php include ('templates/footer.php')?>

我没有错误,但也没有成功。它只是变成空白,表中没有任何条目。

标签: phphtmlmysql

解决方案


问题

您的代码有一些问题...

  1. 您没有连接到数据库
  2. 您正在尝试对mysqli|pdo字符串使用方法(即不是 a mysqli|pdo
  3. 直接在查询中使用变量是不好的做法,并且会让您对 SQL 注入持开放态度
    • 此外,在这种情况下,您的变量似乎是一个字符串,因此即使您要直接在查询中使用它也需要用引号引起来
  4. 拥有两个单独的if语句意味着即使此代码可以正常工作,有时您也会运行带有非 SQL 语句的查询
  5. 您需要启用错误报告
    • 目前您得到一个空白页面,因为有一个未捕获的错误。如果您启用错误报告,那么您将收到一条消息,说明导致问题的原因
  6. 按照您的设置$catName可能会导致Notice消息出现在您的日志文件中

解决方案

要记住的关键事项是:

  1. 对变量使用准备好的语句
  2. 启用错误报告
    • 显示和登录开发环境
    • 隐藏和登录生产

代码

// Enable error reporting in PHP; making errors output to page
error_reporting(E_ALL);
ini_set('display_errors', TRUE);
ini_set('display_startup_errors', TRUE);

// Database credentials:
//   You need to change these to your DB / DB User
$db_host = '127.0.0.1';
$db_user = 'db_username';
$db_pass = 'db_password';
$db_name = 'db_name';

// Database connection
//   - Setting error reporting mode in options
$pdo = new \pdo(
    "mysql:host={$db_host};dbname={$db_name}",
    $db_user,
    $db_pass,
    [
        \PDO::ATTR_ERRMODE          => \PDO::ERRMODE_EXCEPTION,
        \PDO::ATTR_EMULATE_PREPARES => FALSE
    ]
);

// Initialise the variable from the form
//   ?? null   => if the variable doesn't exist then the value will be null
$catName = $_POST["category_name"] ?? null;

// Check to see if the variable exists (and isn't false)
// Warning:
//    If false equivalent values can be entered then you should
//    use a different condition (e.g. `!empty($catName)` )
if ($catName) {

    // The SQL statement with ? as a placeholder for the
    // variable we want to insert
    $sql   = "INSERT INTO categories (c_name) VALUES (?)";  

    $query = $pdo->prepare($sql); // Prepare the query
    $query->execute([$catName]);  // Run the query; passing in the variable to bind

    // Ternary logic to check if "rows were inserted" and echo an appropriate
    // "success" or "failure" message
    echo $query->rowCount() ?
        "Success" :
        "Error, something went wrong!";
}

代码,无评论

error_reporting(E_ALL);
ini_set('display_errors', TRUE);
ini_set('display_startup_errors', TRUE);

$db_host = '127.0.0.1';
$db_user = 'db_username';
$db_pass = 'db_password';
$db_name = 'db_name';

$pdo = new \pdo(
    "mysql:host={$db_host};dbname={$db_name}",
    $db_user,
    $db_pass,
    [
        \PDO::ATTR_ERRMODE          => \PDO::ERRMODE_EXCEPTION,
        \PDO::ATTR_EMULATE_PREPARES => FALSE
    ]
);


$catName = $_POST["category_name"] ?? null;

if ($catName) {
    $sql   = "INSERT INTO categories (c_name) VALUES (?)";
    $query = $pdo->prepare($sql);
    $query->execute([$catName]);

    echo $query->rowCount() ?
        "Success" :
        "Error, something went wrong!";
}

推荐阅读