0

我写了这个脚本,你去 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,它不会打印任何内容。请帮忙?

4

3 回答 3

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 注入的另一个受害者。永远不要相信用户!

于 2013-05-27T23:29:05.797 回答
0

问题是您正在使用if ($usname=$test)而不是if ($usname==$test)

于 2013-05-27T23:26:22.600 回答
0

您在 if 语句中分配了一个错误的变量值,您应该使用双等号比较运算符来比较它们,只需更改

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 注入的影响,请在这篇有用的帖子中了解更多信息如何防止 PHP 中的 SQL 注入?您应该使用准备好的语句来避免任何风险。

于 2013-05-27T23:30:07.770 回答