由于某种原因,我一直收到错误
警告:mysqli_stmt :: bind_param():变量数量与第15行/home/cluster-sites/2/i/inactive_users.php中预准备语句中的参数数量不匹配。
我已经意识到它不喜欢整数,但我需要将id传递给stmt。
<style>
table {width:1000px;border:1px solid #000;}
h1 {text-align:center;padding:0px;margin:0px;}
h2 {padding:0px;margin:0px;}
</style>
<?php
session_start();
include_once'conn.php';
error_reporting(E_ALL);
ini_set('display_errors', 1);
$stmt = $mysqli->prepare("SELECT id, username, firstname, lastname, registerdate FROM users WHERE level < 1");
$stmt->bind_param('issss', $_GET['id'], $_GET['username'], $_GET['firstname'], $_GET['lastname'], $_GET['registerdate']);
$stmt->execute();
$stmt->bind_result($userid, $username, $firstname, $lastname, $registerdate);
?>
这是我使用表格中的信息,如果我删除id一切正常但由于某种原因我在包含id时不断收到错误。
<form method="post" action="admin.php">
<fieldset>
<table>
<tr>
<th colspan="6"><h1>Inactive Users</h1></th>
<tr>
<td><h2>Username</h2></td>
<td><h2>Firstname</h2></td>
<td><h2>Lastname</h2></td>
<td><h2>Date Registered</h2></td>
<td><h2>Days Inactive</h2></td>
<td><h2>Activate</h2></td>
<?php
while ($stmt->fetch()){
$today = new DateTime("now");
$registered = new DateTime($registerdate);
$dayspassed = date_diff($registered, $today);
echo '<tr class="inactiveuser">
<td>'.$username.'</td>
<td>'.$firstname.'</td>
<td>'.$lastname.'</td>
<td>'.$registered->format("d-m-y").'</td>
<td>'.$dayspassed->format("%a days").'</td>
<td>
<select name="dropmenu_'.$userid.'">
<option selected>Select Action</option>
<option value="activate">Activate User</option>
<option value="delete">Delete User</option>
<option value="admin">Admin</option>
</select>
</td>';
}
$stmt->close();
?>
</table>
<input type="submit" name="submit" value="Confirm" />
</fieldset>
</form>
答案 0 :(得分:1)
这样的预备语句用于保护您的数据库免受SQL注入。这只能通过用户输入进行,您的查询没有。
换句话说,查询中没有变量或用户输入,因此没有要绑定的参数。
想象一下以下查询
$stmt = $mysqli->prepare("SELECT id, username FROM users");
这里没有变量可以绑定,所以我们可以完全放弃$stmt->bind_param
。如果我们有像
$stmt = $mysqli->prepare("SELECT id, username FROM users WHERE id=?");
..然后我们需要使用$stmt->bind_param('i', $_GET['id'])
,因为我们有一个要绑定的参数(查询中的?
)。
您的解决方案
因为您没有要绑定的任何参数,并且只有一个带有静态编号的WHERE
子句,所以您可以删除bind_param
。所以你基本上想要准备,执行,绑定结果,获取它们。
$stmt = $mysqli->prepare("SELECT id, username, firstname, lastname, registerdate FROM users WHERE level < 1");
$stmt->execute();
$stmt->bind_result($userid, $username, $firstname, $lastname, $registerdate);
while ($stmt->fetch()) {
/* Do magic here */
}
$stmt->close();
为此目的,您可以使用$mysqli->query()
,因为没有用户输入可以利用它,但请记住,每当您处理用户输入时,请使用占位符查询。
一些阅读材料和文档
答案 1 :(得分:0)
使用bind param时,它会在prepare语句中设置一个参数。
在传递给mysqli_prepare()的SQL语句中绑定参数标记的变量。
http://php.net/manual/en/mysqli-stmt.bind-param.php
您收到此警告
警告:mysqli_stmt :: bind_param():变量数量与第15行/home/cluster-sites/2/i/inactive_users.php中预准备语句中的参数数量不匹配
因为您的准备陈述中没有相应的参数
答案 2 :(得分:0)
$stmt = $mysqli->prepare("SELECT id, username, firstname, lastname, registerdate FROM users
WHERE level < 1
AND id = ?
AND username= ?
AND firstname = ?
AND lastname = ?
AND registerdate = ?");
$stmt->bind_param('issss', $_GET['id'], $_GET['username'], $_GET['firstname'], $_GET['lastname'], $_GET['registerdate']);
试试这样。它会起作用