我写了这个脚本,你去了localhost / censor.php / query,看看它是否被采用。这是代码:
<?php
function curPageURL() {
$pageURL = 'http';
$pageURL .= "://";
if ($_SERVER["SERVER_PORT"] != "80")
$pageURL .= $_SERVER["SERVER_NAME"].":".$_SERVER["SERVER_PORT"].$_SERVER["REQUEST_URI"];
else
$pageURL .= $_SERVER["SERVER_NAME"].$_SERVER["REQUEST_URI"];
return $pageURL;
}
$test = curPageURL();
$test = str_replace('http://localhost/censor.php/',"",$test);
$con = mysqli_connect("localhost","root","creepers2","spider");
if (mysqli_connect_errno())
echo "Failed to connect to MySQL: " . mysqli_connect_error();
$usname = null;
$result = mysqli_query($con, "SELECT * FROM main WHERE urls='$test'");
while($row = mysqli_fetch_array($result) or die(mysqli_error($con))) {
$usname = $row['urls'];
if ($usname=$test)
echo "Taken!";
else
echo"YEAH!";
}
mysqli_close($con);
?>
如果您访问localhost / censor.php / queryinthedatabase,则会打印出来。但是,如果你去localhost / censor.php / querynotinthedatabase,它什么都不打印。 请帮忙吗?
答案 0 :(得分:2)
您正在进行简单的查询:SELECT * FROM main WHERE urls='$test'
。这很好(除了SQL注入)。
现在,您正在使用while($row = mysqli_fetch_array($result) or die(mysqli_error($con)))
获取所有结果并循环显示它们。也就是说,如果没有结果,它就不会遍历任何对象,因为它无法获取任何对象。
您应该使用mysqli_num_rows
之类的内容。例如:
$result = mysqli_query($con, "SELECT * FROM main WHERE urls='" . mysqli_real_escape_string($test) . "'");
if (mysqli_num_rows($result) == 1) {
echo "Taken!";
}
else {
echo "YEAH!";
}
现在您正在执行相同的查询(选择urls
等于$test
的所有行),但不是循环返回的行,而是计算行的数量。查询返回。如果它等于1
,那就是它。
另外,请转义您在查询中输入的任何用户输入;不能成为SQL注入的另一个受害者。 永远不要相信用户!
答案 1 :(得分:0)
问题是您使用的是if ($usname=$test)
而不是if ($usname==$test)
答案 2 :(得分:0)
您在if语句中分配了一个错误的变量值,您应该使用双equl coparison运算符来比较它们,只需更改
if ($usname==$test)
另外,为了调试您的查询,您应该将mysqli_error移动到查询本身
$result = mysqli_query($con, "SELECT * FROM main WHERE urls='$test'") or die(mysqli_error($con));
while($row = mysqli_fetch_array($result)) {
您的代码非常容易受到mysql注入攻击,请在此有用的帖子中了解更多信息How can I prevent SQL injection in PHP?您应该使用预准备语句来避免任何风险。