尝试使用PHP通过表单创建数据库条目

尝试使用PHP通过表单创建数据库条目,php,html,mysql,Php,Html,Mysql,我只是不知道我错在哪里。尝试使用多个表,但未成功 <?php if(isset($_POST['submit'])){ // create sql $catName = $_POST['category_name']; $sql = "INSERT INTO Categories(c_name) VALUES($catName)"; } if($catName->query($sql) === TRUE) {

我只是不知道我错在哪里。尝试使用多个表,但未成功

<?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')?>

我没有犯错,也没有成功。它只是变为空白,表中没有条目。

问题 您的代码有一些问题

  • 您没有连接到数据库
  • 您试图对字符串使用
    mysqli|pdo
    方法(即,不是
    mysqli|pdo
  • 直接在查询中使用变量是一种不好的做法,会让您接受SQL注入
    • 此外,在本例中,变量似乎是字符串,因此即使要在查询中直接使用它,也需要在引号中
  • 拥有两个独立的
    if
    语句意味着即使此代码以其他方式工作,有时也会使用非SQL语句运行查询
  • 您需要启用错误报告
    • 当前,由于存在未捕获的错误,您将获得一个空白页。如果启用错误报告,则会收到一条消息,说明问题的原因
  • 按您的方式设置
    $catName
    ,可能会导致日志文件中出现
    注意
    消息
  • 解决方案 要记住的关键是:

  • 对变量使用准备好的语句
  • 启用错误报告
    • 在开发环境中显示和登录(&L)
    • 隐藏并登录生产
  • 代码

    // 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!";
    }
    

    我的主要问题不是PHP,尽管上面的一些答案对改进我的代码非常有帮助

    原来问题是在形式上。在重做整件事之后,它突然起了作用


    谢谢您的回答。

    看看如何获取。仅仅因为您没有看到错误,并不意味着没有错误。尽管我可以肯定地告诉您,在字符串上运行查询肯定会引发错误:
    $catName->query($sql)
    。您已初始化
    $catName=$\u POST['category\u name'],表示它是表单中的字符串。您在哪里连接到数据库?另外,您的整个逻辑应该在
    if(isset($\u POST['submit'])
    中,而不仅仅是变量初始化。太好了,这解决了我的问题!非常感谢。