【问题标题】:check duplicate rand function value in database and generate it again检查数据库中重复的rand函数值并再次生成
【发布时间】:2017-06-06 04:40:59
【问题描述】:

我创建 rand 函数用于生成随机值并与其他值连接并在插入此值之前通过 ajax 显示在文本字段中。但是在这里,在将这个值插入数据库之前,我如何检查这个随机生成值是否存在于数据库中。如果值存在,则再次生成 rand 函数值并再次连接它并在文本框中显示该值。我怎样才能做到这一点?我的代码在下面 index.php

    <html>    
<head>
    <title>Untitled Document</title>
    <script 
    src="https://ajax.googleapis.com/ajax/libs/jquery/3.2.1/jquery.min.js">
    </script>
    <script>
    $( document ).ready(function() {});
    function my_validate_func() {
    var name = $('#name').val();
    var year = $('#year').val();
    var course = $('#course').val();
    var branch_name = $('#branch_name').val();
        if ($('#name').val() != "" && $('#year').val() != "" &&
            $('#course').val() != "" && $('#branch_name').val() != "") {
            $.ajax({
                type: "POST",
                url: 'roll.php',
                data: { name: name, year: year, branch_name: branch_name, course: course },
                success: function(response) {
                    $('#roll').val(response);
                }
            });
        }
    }
</script>
</head>

<body>
    <form method="post" action="">
        <input type="text" name="name" id="name" onChange="my_validate_func()">
        <input type="text" name="phone" id="phone" onChange="my_validate_func()">
        <input type="text" name="course" id="course" onChange="my_validate_func()">
        <input type="text" name="center" id="center" onChange="my_validate_func()">
        <input type="text" name="roll" id="roll" value="">
    </form>
</body>

</html>

roll.php





    <?php
function calculateRoll()
{
    $name1        = $_POST['name'];
    $year1        = $_POST['year'];
    $course1      = $_POST['course'];
    $branch_name1 = $_POST['branch_name'];
    $name2        = substr($name1,0,3);
    $name         = strtoupper($name2);
    $year         = substr($year1,-2);
    $branch_name  = strtoupper(substr($branch_name1,0,3));
    $course2      = substr($course1,0,3);
    $course       = strtoupper($course2);
    $rand         = rand(100000,999999);
    $roll         =$branch_name.$name.$course.$year.$rand;
    //return $roll;
    echo $roll;
}

function isValidRoll($roll) {
    mysql_connect("localhost","root","");
    mysql_select_db("sigma");
    $sql="SELECT count(*) as total FROM student WHERE roll = '$roll'";
    $result = mysql_query($sql);

    $data = mysql_fetch_assoc($result);
    return $data['total'] == 0;
}

$validRoll = false;
$roll = calculateRoll();
while (!$validRoll) {
    if (isValidRoll($roll)) {
        $validRoll = true;
    } else {
        $roll = calculateRoll();
    }
}
?>

【问题讨论】:

  • 发布完整代码。这没有帮助
  • 您可以使数据库中的字段唯一。因此,当您尝试进行插入时,您会收到一个错误,并且您会知道该字段已经存在,或者如果您已经获得了行,则只需选择它们。
  • 您使用SELECT...WHERE columnName = rand 进行检查。如果返回结果,则表示存在重复,如果没有,则表示尚不存在

标签: javascript php jquery mysql ajax


【解决方案1】:

我建议使用 md5 函数和/或 time() 函数,例如:

$rand         = md5(time() + rand(100000,999999));

您更新后的代码应该是:

$name1        = $_POST['name'];
$year1        = $_POST['year'];
$course1      = $_POST['course'];
$branch_name1 = $_POST['branch_name'];
$name2        = substr($name1,0,3);
$name         = strtoupper($name2);
$year         = substr($year1,-2);
$branch_name  = strtoupper(substr($branch_name1,0,3));
$course2      = substr($course1,0,3);
$course       = strtoupper($course2);
$rand         = md5(time() + rand(100000,999999));
$roll         = $branch_name.$name.$course.$year.$rand;

echo $roll;

此解决方案提供独特的价值。您也可以使用uniqid() 功能。还记得将数据库字段设置为唯一。


另一种解决方案是将卷创建登录保留在一个函数中,并创建另一个函数来检查卷是否存在。您有责任检查其他卷是否存储在数据库或文本文件中,...

function calculateRoll()
{
    $name1        = $_POST['name'];
    $year1        = $_POST['year'];
    $course1      = $_POST['course'];
    $branch_name1 = $_POST['branch_name'];
    $name2        = substr($name1,0,3);
    $name         = strtoupper($name2);
    $year         = substr($year1,-2);
    $branch_name  = strtoupper(substr($branch_name1,0,3));
    $course2      = substr($course1,0,3);
    $course       = strtoupper($course2);
    $rand         = rand(100000,999999);
    return $branch_name.$name.$course.$year.$rand;
}

function isValidRoll($roll) {
    $result = mysql_query("SELECT count(*) as total FROM student WHERE roll = '$roll'")
        or die("Query not valid: " . mysql_error());
    $data = mysql_fetch_assoc($result);
    return $data['total'] == 0;
}

$validRoll = false;
$roll = calculateRoll();
while (!$validRoll) {
    if (isValidRoll($roll)) {
        $validRoll = true;
    } else {
        $roll = calculateRoll();
    }
}

【讨论】:

  • 虽然这不能回答 OP 的问题,但它确实提供了一个很好的选择
  • 与其解决问题,不如避开它们^_^
  • 好的,如果我使用 md5 函数,那么卷号是很长的值。我想这样展示 MUMSUSII88987654
  • 是的,我正在更新我的答案。您可以拆分创建卷的逻辑并创建一个函数来检查唯一性。然后,...生成卷,直到创建的卷是唯一的。
  • 你的代码有什么问题?我的意思是,...$branch_name.$name.$course.$year.$rand 有什么问题?
【解决方案2】:

当您保存表单存储 rand 函数值的数据时,也意味着您可以在第二次检索 rand 函数值并与当前的 rand 函数生成值进行比较。

【讨论】:

    猜你喜欢
    • 2012-09-06
    • 2021-11-03
    • 2018-12-11
    • 1970-01-01
    • 1970-01-01
    • 2016-04-13
    • 2016-08-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多