php - 如何通过 SQL 选择要保存到的数据库
问题描述
我想创建一个登录屏幕,用户可以通过单选按钮根据他们的职业选择要保存到哪个数据库。我已经解决了大多数错误,但这些错误:
注意:未定义变量:第 34 行 C:\xampp\htdocs\project\save.php 中的 sqlinsert
警告:mysqli_query():第 34 行 C:\xampp\htdocs\project\save.php 中的空查询
拒绝离开。这是我的HTML:
<form method="post" action="http://localhost/project/save.php">
<legend align="left">Login</legend>
<input type="text" placeholder="Username" name="uname"><br>
<input type="password" placeholder="Password" name="password"><br>
<p>
<label>
<input type="radio" name="dbchoice" value="admin" id="RadioGroup1_0">
Admin</label>
<br>
<label>
<input type="radio" name="dbchoice" value="expert" id="RadioGroup1_1">Mental health experts</label>
<br>
</p>
<input type="submit" value="Save" name="save">
<input type="reset" value="Cancel">
</form>
这是我的PHP:
<?php
$hostname = "localhost";
$username = "root";
$password = "";
$db = "project";
//connect to the database using procedural method
$dbconnect = mysqli_connect($hostname,$username,$password,$db);
if(!$dbconnect){
echo "an error occured while connecting to the database";
}
if(isset($_POST['save'])){
//get values from the form
$username = $_POST['uname'];
$password = $_POST['password'];
//write the SQL STATEMENT FOR SAVING - INSERT
if (isset($dbchoice) && $dbchoice==$_POST["admin"]) {
$sqlinsert = "INSERT INTO administrator
(username, password)
VALUES('$username','$password')";
}elseif (isset($dbchoice) && $dbchoice==$_POST["expert"]){
$sqlinsert = "INSERT INTO experts
(username, password)
VALUES('$username','$password')";
}else{
echo "An error occured while writing to database.";
}
if(mysqli_query($dbconnect,$sqlinsert)){
echo "<script type='text/javascript'> alert('Data saved successfully');</script>";
header('location: index.php');
}else{
echo "An error occured while saving";
}
//close the connection
mysqli_close($dbconnect);
}else{
header('location: index.php');
}
?>
解决方案
您错误地尝试将变量$dbchoice
与不存在的 POST 字段进行比较$dbchoice==$_POST["admin"]
- 该字段是dbchoice
但值是admin
您需要测试这些字段是否存在于 POST 数组中,并且当且仅当它们存在时才将其分配为变量 - 也许这可能会有所帮助。另外-如果应该使用默认表,则将该单选按钮设置为selected
可能?!
永远不要将未经处理的用户输入视为安全 - 不要像在此处那样在 SQL 语句中使用它,始终使用prepared statement
带有正确绑定参数的 a。
<?php
error_reporting(E_ALL);
if (isset($_POST['save'], $_POST['uname'], $_POST['password'], $_POST['dbchoice'])) {
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$hostname = "localhost";
$username = "root";
$password = "";
$db = "project";
$dbconnect = mysqli_connect($hostname, $username, $password, $db);
$username = $_POST['uname'];
$password = $_POST['password'];
$dbchoice = $_POST['dbchoice'];
switch ($dbchoice) {
case 'admin':
$sql = 'insert into `administrator` (`username`, `password`) values (?,?)';
break;
case 'expert':
$sql = 'insert into `experts` (`username`, `password`) values( ?,? )';
break;
default:
$sql = false;
break;
}
if ($sql) {
$stmt = $dbconnect->prepare($sql);
$stmt->bind_param('ss', $username, $password);
$stmt->execute();
header('Location: index.php');
exit;
}
}
推荐阅读
- python - 将浮点数四舍五入到保留几个小数位的最小数字
- ios - addSubview 在 UIView 中不起作用 - Swift 编程
- npm - 如何安全地删除在错误文件夹中完成的 npm init?
- javascript - Jest automock 失败:TypeError: fs.readdirSync is not a function
- r - 将表格中的数据格式化为百分比
- javascript - 省略文件扩展名,ES6模块NodeJS
- python - 分配动态变量名称
- apache-spark - 在 pyspark 中逐年递增地将日期转换为周数(滚动平均值)
- javascript - Billboard.js:$$.generatePoint 不是函数
- php - 使用@can Blade 指令时出现参数计数错误