我有这段代码:
$list_summoners = $con->query("SELECT * FROM verified_users WHERE Username='" . $search_user . "'");
我想知道如何格式化它,例如:
$list_summoners = mysqli_query($con, "SELECT * FROM verified_users WHERE Username='" . $search_user . "'");
echo '<table align="center" style="text-align:center;"><tr><th>User</th><th>Summoner ID</th><th>Summoner Region</th><th>View Summoner</th></tr>';
while($row = mysqli_fetch_array($list_summoners)) {
echo '<tr><td>' . $row['username'] . '</td><td>' . $row['summoner_id'] . '</td><td>' . $row['summoner_region'] . '</td><td><a href="action.php?do=view_summoner&zone=c&summoner_id=' . $row['summoner_id'] . '&summoner_region=' . $row['summoner_region'] . '"><span class="button color_dark">View</span></a></td></tr>';
}
echo '</table>';
我问这个,因为我知道mysqli_query可以滥用。
提前致谢。
答案 0 :(得分:0)
mysqli_query($con, 'SELECT...')
,在面向对象模式中调用vs $con->query('SELECT...')
执行完全相同的函数。在这两种模式中,$con
都是同一个对象 - mysqli
连接对象,但MySQLi API提供了两种与之交互的方法。
因此,mysqli_query()
和$con->query()
的使用 同样不安全,当您按照使用它们的方式使用时,在变量$search_user
中连接。安全方法是完全避免mysqli_query()
,而是use a prepared statement:
$stmt = $con->prepare('SELECT * FROM verified_users WHERE Username = ?');
if ($stmt) {
$stmt->bind_param('s', $search_user);
$stmt->execute();
// Then bind & fetch()...
}
else echo $con->error;
有关详细信息,请参阅How can I prevent SQL injection in PHP。从准备好的声明中执行和获取的例子。
使用$con->query()
,要获取while
循环的行,您可以调用$list_summoners->fetch_array()
,因为它是class mysqli_result
的对象
if ($list_summoners) {
while ($row = $list_summoners->fetch_array()) {
echo '<table align="center" style="text-align:center;"><tr><th>User</th><th>Summoner ID</th><th>Summoner Region</th><th>View Summoner</th></tr>';
echo '<tr><td>' . htmlspecialchars($row['username']) . '</td><td>' . htmlspecialchars($row['summoner_id']) . '</td><td>' . htmlspecialchars($row['summoner_region']) . '</td><td><a href="action.php?do=view_summoner&zone=c&summoner_id=' . htmlspecialchars($row['summoner_id']) . '&summoner_region=' . htmlspecialchars($row['summoner_region']) . '"><span class="button color_dark">View</span></a></td></tr>';
echo '</table>';
}
}
请注意,当以HTML格式发送到输出时,会向这些值添加htmlspecialchars()
。即使这些不是源于用户输入,但它是一个重要的习惯,因为它会在输出源自用户输入的值或包含需要HTML中的实体编码的字符的值时阻止跨站点脚本。