我对php很新,并且有一个问题。我有一个HTML表单,它通过PHP从SQL表中自动填充SELECT。下拉列表将填入所有用户级别为" Admin"或者"主持人"。这是要连接的代码:
$con = mysqli_connect("localhost", "root", "", "database") or die("Error " . mysqli_error($con));
下拉本身:
<form name="htmlform" role="form" method="POST" action="result.php">
<select id="user" name="user" required>
<option selected disabled>User</option>
<?php
$result = $con->query("SELECT username FROM users WHERE level='admin' OR level='moderator' ORDER BY level");
while ($row = $result->fetch_assoc())
{
$username = $row['username'];
echo '<option value="'.$username.'">'.$username.'</option>';
}
?>
</select>
这完美无缺。我遇到的问题是我正在尝试重复使用此表单中的数据(特别是$ _POST [&#39; user&#39;])在另一个页面上自动填充表单中的另一个字段。我需要查看用户是否&#39;是否为管理员,并将$ other返回为&#34; y&#34; (管理员)或&#34; n&#34; (不是Admin),然后将其添加到另一个表中。
这是我在第二页的代码(result.php):
$user=$_POST['user'];
$query = $con->query("SELECT level FROM users WHERE username=$user");
$variable=mysqli_query($con, $query);
if ($variable=="admin") {
$other = 'y';
} else {
$other='n';
}
目前,$ other的所有输出都是&#34; n&#34;无论如何。所以,显然我在代码中有错误,但是不知道足够的php能够发现或纠正它。 请有人帮忙指出错误吗?
答案 0 :(得分:2)
文本值必须用查询中的引号括起来
$query = $con->query("SELECT level FROM users WHERE username='$user'");
您也似乎在尝试两次执行相同的查询:
$query = $con->query("SELECT level FROM users WHERE username=$user");
$variable=mysqli_query($con, $query);
这不是合法用法。
此外,当您运行此行
时$variable=mysqli_query($con, $query);
$variable
不是值,而是包含结果集的mysqli_result
对象,如果查询失败,则为FALSE,但如果查询中的id
列,则绝对不是内容。
但是,如果您使用的是从用户那里获得的数据,那么假设您没有尝试SQL Injection Attack
是不安全的所以你应该使用像这样的准备和参数化查询
$stmt = $con->prepare("SELECT level FROM users WHERE username=?");
$stmt->bind_param('s', $_POST['user']);
$stmt->execute();
答案 1 :(得分:1)
(没有涉及最佳实践的问题......)
您的第二个代码段对mysql_query()
的返回值的使用存在问题。
对于SELECT,SHOW,DESCRIBE,EXPLAIN和其他语句返回 resultset,mysql_query()在成功时返回资源,或者返回FALSE 错误。
因此,$variable
是PHP资源,不能等于字符串。
尽可能使用tripple ===
等于。你仍然需要&#34; fetch&#34;来自结果资源的记录(您设法在第一个代码段中执行此操作)。
一般来说......
$result = mysqli_query($con, $query);
$record = result->fetch_assoc();
//if(result->fetch_assoc()['level'] === 'admin') in PHP 5.4 and up.
//or
//if(mysqli_query($con, $query)->fetch_assoc()['level'] === 'admin') in PHP 5.4 and up.
if($record['level'] === 'admin')
{
}
else
{
}
干杯!
答案 2 :(得分:0)
根据mysqli_query doc:
失败时返回FALSE。对于成功的SELECT,SHOW,DESCRIBE或EXPLAIN查询,mysqli_query()将返回一个mysqli_result对象。对于其他成功的查询,mysqli_query()将返回TRUE。
所以不要期望直接从调用中获取数据库值,而是将mysql_result对象(您创建了SELECT)与常量字符串进行比较。您需要从mysql_result对象获取数据,然后才能进行比较。
答案 3 :(得分:-1)
此代码适用于您:
$user = $_POST['user'];
$sql = "SELECT level FROM users WHERE username={$user}";
$variable = mysqli_query($con, $sql)->fetch_row();
if ($variable[0]=="admin") {
$other = 'y';
} else {
$other='n';
}