如何验证一个用户对当前日期的一个条目?

时间:2016-02-23 09:42:27

标签: php mysql

我正在开发和员工考勤门户网站,我想限制用户为特定日期创建一个条目。 因此,当前日期的出勤率不会重复。

    require('../config1.php');
    date_default_timezone_set('Asia/Kolkata');
    $Username=$_SESSION['sess_user'];
    $Ptype= mysqli_escape_string($con, $_POST['ptype']);
    $Time = time();
    $TimeIN = date('Y-m-d H:i:s',$Time);
    $Date = CURDATE('');
    $Day = date('N');



    mysqli_query($con, "INSERT INTO presence(pid,username,ptype,timein,date,pday) 
    VALUES (NULL,'$Username','$Ptype','$TimeIN','$Date','$Day')") 
    or die(mysqli_error($con));

因此,使用我当前的代码,一个用户可以在同一天进行多次输入。

3 个答案:

答案 0 :(得分:0)

有几种方法可以解决这个问题。

在PHP中: 首先,您可以在插入之前检查表presence中没有相同用户名和行的行。 date,然后决定是否插入数据。

require('../config1.php');
    date_default_timezone_set('Asia/Kolkata');
    $Username=$_SESSION['sess_user'];
    $Ptype= mysqli_escape_string($con, $_POST['ptype']);
    $Time = time();
    $TimeIN = date('Y-m-d H:i:s',$Time);
    $Date = CURDATE('');
    $Day = date('N');

    $req_pre = mysqli_prepare($bdd, 'select pid from presence where username=? and date=?');
    mysqli_stmt_bind_param($req_pre, $Username, $Date);
    //If the row is there, then your user has already registered, else he hasn't.

    mysqli_query($con, "INSERT INTO presence(pid,username,ptype,timein,date,pday) VALUES (NULL,'$Username','$Ptype','$TimeIN','$Date','$Day')") or die(mysqli_error($con));
}

同时使用PHP和SQL : 我不知道你的sgbd所以你必须确定解决方案的确切语法。 我不知道你是如何设置你的唯一索引的,但你可以让多列定义你的唯一索引,因此它将确保sql中表中只有一行。 例如在mysql中它将是

ALTER TABLE `presence` ADD UNIQUE `unique_index`(`username`, `date`);

这就是全部吗?不是真的,如果你使用相同的$ username和$ date将用户添加到你的表格中,那么你的php将返回错误。 Mysqli不会自然地发送throw错误,因此您必须手动处理它们(构建一个系统来抛出它们)。这是一个转机

  require('../config1.php');
    date_default_timezone_set('Asia/Kolkata');
    $Username=$_SESSION['sess_user'];
    $Ptype= mysqli_escape_string($con, $_POST['ptype']);
    $Time = time();
    $TimeIN = date('Y-m-d H:i:s',$Time);
    $Date = CURDATE('');
    $Day = date('N');

    mysqli_query($con, "INSERT INTO presence(pid,username,ptype,timein,date,pday) 
    VALUES (NULL,'$Username','$Ptype','$TimeIN','$Date','$Day')");
    if (mysqli_errno == 1062) {
        //There it is a duplicate entry
        print 'no way!';
    }

请注意,它只会捕获“DUPLICATE”错误,而不会捕获其他错误。

我希望这会对你有所帮助

答案 1 :(得分:0)

您可以使用INSERT IGNORE INTO查询来实现目标。如果该行不存在,它将插入该行,如果该行已存在则忽略该查询。因此,如果该人已经标记了出勤,那么下一次尝试将被忽略。 您可以参考此链接了解更多详情:http://bogdan.org.ua/2007/10/18/mysql-insert-if-not-exists-syntax.html

示例:

"INSERT IGNORE INTO 'presence' 
SET 'pid'=NULL,
'username' =$Username,
'ptype' = $Ptype,
'timein' = $TimeIN,
'date' = $Date,
'pday' = $Day;

答案 2 :(得分:0)

您可以让INSERT语句进行测试。请注意,您可以跳过 pid 列,无论如何都要传递 null

INSERT INTO presence(username, ptype, timein, `date`, pday) 
SELECT '$Username', '$Ptype', '$TimeIN', '$Date', '$Day'
FROM   dual
WHERE  ('$Username', '$Date') NOT IN
       (SELECT  username, `date`
        FROM    presence)

请注意,FROM dual就在那里,因为语法需要FROM子句。另外,由于 date 是一个保留字,所以你最好在它周围添加反引号。

如果在 ptype 不同时允许多条记录,则将该列添加到WHERE子句和子查询中。

然后在PHP代码中,您可以检查是否插入了行:

if (mysqli_affected_rows($con) == 0) {
    // duplicate detected. No insert done.
    echo "You cannot enter another presence for the same day";
}

替代

如果它是一般规则(也可能在其他代码中),那么这些重复项可以从不允许存在于您的表中,那么您应该在数据库级别定义它,如下所示:

ALTER TABLE presence
    ADD UNIQUE INDEX idx_username_date (username, `date`);

在您完成上述操作之前,您必须确保您的表格中没有此类重复项,否则该声明会对此抱怨。

然后在您的代码中检查是否有错误并报告:

$result = mysqli_query($con, 
    "INSERT INTO presence(username, ptype, timein, `date`, pday) 
     VALUES ('$Username', '$Ptype', '$TimeIN', '$Date', '$Day')");
if (!$result) { 
    // INSERT did not happen. 
    if (mysqli_errno($con) == 1062) { // Duplicate entry 
        // Treat duplicate
        echo "You cannot enter another presence for the same day";
    } else {
        // another error occurred: report it and exit.
        echo mysqli_errno($con) . " - " . mysqli_error($con)
        exit();
    }
}

在显示“重复”消息后是否还要退出取决于您是否仍想执行其余代码。