php - 尝试使用 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')?>
我没有错误,但也没有成功。它只是变成空白,表中没有任何条目。
解决方案
问题
您的代码有一些问题...
- 您没有连接到数据库
- 您正在尝试对
mysqli|pdo
字符串使用方法(即不是 amysqli|pdo
) - 直接在查询中使用变量是不好的做法,并且会让您对 SQL 注入持开放态度
- 此外,在这种情况下,您的变量似乎是一个字符串,因此即使您要直接在查询中使用它也需要用引号引起来
- 拥有两个单独的
if
语句意味着即使此代码可以正常工作,有时您也会运行带有非 SQL 语句的查询 - 您需要启用错误报告
- 目前您得到一个空白页面,因为有一个未捕获的错误。如果您启用错误报告,那么您将收到一条消息,说明导致问题的原因
- 按照您的设置
$catName
可能会导致Notice
消息出现在您的日志文件中
解决方案
要记住的关键事项是:
- 对变量使用准备好的语句
- 启用错误报告
- 显示和登录开发环境
- 隐藏和登录生产
代码
// 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!";
}
推荐阅读
- python - 循环网络子网
- .net-core - 从现有 WSDL 创建 SOAP 服务(不消耗)
- react-native - 如何将数组数组映射到反应本机选择器
- flutter - 如何传递设备 ID(颤振)
- c# - UWP:为什么 DataTemplate 中的行为有一个空的 AssociatedObject?
- prolog - Prolog 程序查找“右”和“上”在 10X10 网格中移动的路径列表
- javascript - 如何从过滤数据表jQuery中删除html部分
- c++ - 如何在我的代码中使用正则表达式来拆分以逗号分隔的字符串行
- c# - 如何以 Fire-And-Forget 的形式调用委托调用
- powershell - Powershell 打破任何按键的等待