PHP - 根据自动填充的选择填充字段

时间:2017-02-02 17:44:56

标签: php mysql sql

我对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能够发现或纠正它。 请有人帮忙指出错误吗?

4 个答案:

答案 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();
  

我认为你应该开始by reading the PHP manual for the mysqli extension

答案 1 :(得分:1)

(没有涉及最佳实践的问题......)

您的第二个代码段对mysql_query()的返回值的使用存在问题。

The PHP Manual states

  

对于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';
}