1

我正在尝试制作一个脚本来检查是否已将 int 添加到我的数据库中。如果是这样,它将重新生成另一个随机数并再次检查。如果它不存在,它将插入到数据库中。

但是,我遇到了麻烦。如果存在一个数字,它只会打印出num存在,我将如何重新循环它以检查另一个数字然后插入它?我尝试使用继续;,返回真;等等......无论如何,这是我的代码;希望有人可以帮助我!

<?php
require_once("./inc/config.php");

$mynum = 1; // Note I am purposely setting this to one, so it will always turn true so the do {} while will be initiated.

echo "attempts: ---- ";

$check = $db->query("SELECT * FROM test WHERE num = $mynum")or die($db->error);

if($check->num_rows >= 1) {
    do {

        $newnum = rand(1, 5);
            $newcheck = $db->query("SELECT * FROM test WHERE num = $newnum")or die($db->error);
                if($newcheck->num_rows >= 1) {
                echo $newnum . " exists! \n";
                } else {
            $db->query("INSERT test (num) VALUES ('$newnum')")or die($db->error);
            echo "$newnum - CAN INSERT@!@!@";
            break;
        }

    } while(0);
}
?>
4

3 回答 3

1

我认为您正在寻找的逻辑基本上是这样的:

do {
  $i = get_random_int();
} while(int_exists($i));
insert_into_db($i);

(提出一些函数名称通常有助于简化事情并了解真正发生的事情。)

现在只需用您的代码替换伪函数:

do {
  $i = rand(1, 5);
  $newcheck = $db->query("SELECT * FROM test WHERE num = $i")or die($db->error);
  if ($newcheck->num_rows >= 1) {
    $int_exists = true;
  } else {
    $int_exists = false;
  }
} while($int_exists);
$db->query("INSERT test (num) VALUES ('$i')") or die($db->error);

当然,你可以做更多的调整,通过缩短......

// ...
  if ($newcheck->num_rows >= 1) {
    $int_exists = true;
  } else {
    $int_exists = false;
  }
} while($int_exists);

...到:

// ...
  $int_exists = $newcheck->num_rows >= 1;
} while($int_exists);

>=比较的结果是布尔值,如您所见,您也可以将此值分配给变量,这样可以节省 4 行代码。)

此外,如果您想更进一步,请尝试将您的数据库调用替换为实际的、有意义的函数,就像我在第一个示例中所做的那样。

这样,您的代码将变得更具可读性、紧凑性和可重用性。最重要的是,通过这种方式您可以了解更多关于编程的知识。

于 2013-09-09T19:12:27.257 回答
0

这里的逻辑不正确。您的do-while循环将只执行一次(因为它是一个退出控制的循环),并将在下一次迭代时停止,因为while(0)条件是FALSE.

请尝试以下操作:

while($check->num_rows >= 1) {
    $newnum = rand(1, 5);
    $newcheck = $db->query("SELECT * FROM test WHERE num = $newnum")or die($db->error);

    if ($newcheck->num_rows >= 1) {
        echo $newnum . " exists! \n";
    } else {
        $db->query("INSERT test (num) VALUES ('$newnum')") or die($db->error);
        echo "$newnum - CAN ISNERT@!@!@";
        break;
    }
}

旁注:就目前而言,您的查询容易受到SQL 注入的攻击,并可能产生意外结果。您应该始终转义用户输入。看看这个StackOverflow 线程,了解如何防止 SQL 注入。

于 2013-09-09T19:07:37.473 回答
0

这是我使用一些以前制作的脚本拼凑起来的一些代码示例。与您的代码相比,您会注意到一些变化,但这个概念应该是一样的。希望能帮助到你。

在我的示例中,我将从包含的配置文件中提取数据库 HOST、USER、PASSWORD 和 NAME

require_once("./inc/config.php");

echo "attempts: ---- ";

$running = true;
while($running == true) {

//create random number from 1-5
$newnum = rand(1,5); 

//connect to database
$mysqli = new mysqli(HOST, USER, PASSWORD, NAME); 
//define our query
$sql = "SELECT * FROM `test` WHERE `num` = '".$$newnum."'"; 
//run our query
$check_res = mysqli_query($mysqli, $sql) or die(mysqli_error($mysqli));

    //check results, if num_rows >= our number exists
    if (mysqli_num_rows($check_res) >= 1){ 
    echo $newnum . " exists! \n";
}
else { //our number does not yet exists in database

    $sql = "INSERT INTO `test`(`num`) VALUES ('".$newnum."')";
    $check_res = mysqli_query($mysqli, $sql) or die(mysqli_error($mysqli));
    if ($check_res){
        echo $newnum . " - CAN ISNERT@!@!@";

        // close connection to datbase
        mysqli_close($mysqli);
    }
    else{
        echo "failed to enter into database";
        // close connection to database
        mysqli_close($mysqli); 
    }
    break;
}


}

我还想指出,如果所有数字都已被使用,这将继续运行,您可能需要输入一些东西来跟踪所有数字何时被使用,并导致中断跳出循环。

希望这可以帮助!

于 2013-09-09T19:30:33.003 回答