Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 选择date=NOW()所在的行?_Php_Mysql_Sql_Database_Select - Fatal编程技术网

Php 选择date=NOW()所在的行?

Php 选择date=NOW()所在的行?,php,mysql,sql,database,select,Php,Mysql,Sql,Database,Select,我试图创建一个表,根据日期和用户id记录步骤。但当我运行代码时,如果用户每天多次记录步骤,我会得到重复的行。我不能有一个具有唯一密钥的日期,因为如果任何其他用户在同一天记录了步骤,这将导致所有其他用户无法记录步骤。因此,我的观点是,我想删除用户id和日期相同的重复行的选项。我有两张桌子 表a和表b,我将它们称为某物 使用$entry=“SELECT*FROM table.a WHERE userid.a='$user\u id.b'和date=NOW()“ 我想用它作为一个条件来决定UPDATE

我试图创建一个表,根据日期和用户id记录步骤。但当我运行代码时,如果用户每天多次记录步骤,我会得到重复的行。我不能有一个具有唯一密钥的日期,因为如果任何其他用户在同一天记录了步骤,这将导致所有其他用户无法记录步骤。因此,我的观点是,我想删除用户id和日期相同的重复行的选项。我有两张桌子

表a和表b,我将它们称为某物

使用
$entry=“SELECT*FROM table.a WHERE userid.a='$user\u id.b'和date=NOW()“

我想用它作为一个条件来决定
UPDATE
INSERT到
表中。我从以前的一个查询中得到了
user\u id.b
,该查询按原样工作,因此我将暂时保持原样

以下是我查询数据库的方式:

$entry_result = mysqli_query($conn, $entry);
这里使用的是:

if (mysqli_num_rows($entry_result) > 0){
    $conn->query("UPDATE steplogger SET steps='$steps' WHERE userid='$user_id' AND date=NOW()");
} else {
    $conn->query("UPDATE users SET totalsteps = totalsteps + ('$steps') WHERE username = '$user'");
    $conn->query("INSERT INTO steplogger (steps, userid, date) VALUES ('$steps', '$user_id', NOW())");
}
有没有想过我做错了什么

注:当我
回显$entry\u结果时
我得到一个mysqli对象。

正如你所说:

我想删除在用户id和日期之间有重复行的选项

最好的方法是在
user\u id
date
上创建一个唯一索引,这样您就无法插入两行具有相同
user\u id
date
的数据

有了一个唯一的索引,您可以使用
INSERT…ON DUPLICATE KEY UPDATE
执行您想要的操作:您将插入一个新行(new
user\u id
+
date
),如果已经存在一个具有相同
user\u id
date
的行,您将更新该行

以下是文档:

您可以这样尝试

if (mysqli_num_rows($entry_result) > 0){
    $conn->query("UPDATE steplogger SET steps='$steps' WHERE userid='$user_id' AND date=".NOW().")";
} else {
    $conn->query("UPDATE users SET totalsteps = totalsteps + ('$steps') WHERE username = '$user'");
    $conn->query("INSERT INTO steplogger (steps, userid, date) VALUES ('$steps', '$user_id', ".NOW()."))";
}
要在NOW()函数中获取当前日期,可以使用以下命令。
而且这两个条件的格式也应该相同。

如果执行
SELECT NOW()
你会看到它返回类似
2018-10-25 14:42:55
,你确定要
=
加秒吗?MySQL NOW()函数以“YYYY-MM-DD HH:MM:DD”或“yyyyymmddhhmmss.uuuuuuu”格式中的字符串或数字形式返回配置时区中的当前日期和时间。您可以检查
CURDATE()
是否更适合您。警告:使用
mysqli
时,您应该使用并将用户数据添加到查询中。不要使用字符串插值或串联来完成此操作,因为您已经创建了严重的错误。切勿将
$\u POST
$\u GET
或任何用户数据直接放入查询中,如果有人试图利用您的错误,这可能会非常有害。注意:
mysqli
的面向对象界面明显不那么冗长,使代码更易于阅读和审核,并且不容易与过时的
mysql\u查询
接口混淆。在你对程序性风格投入太多之前,值得换一种。示例:
$db=new mysqli(…)
$db->prepare(“…”)
过程接口是PHP 4时代的产物,当时引入了
mysqli
API,不应该在新代码中使用。这导致了我担心的结果。我想我在描述我的问题时不够清楚,但问题在于这种类型的解决方案,如果随机用户登录了一些步骤,比如说2018年10月27日,那么在
用户id
日期
上都有
唯一索引
,其他用户不允许在同一日期记录步骤。这有助于理解我的问题吗?那么你说的是,当随机用户登录到你的数据库时,你有一个通用的
user\u id
?如果
user\u id
是唯一的(它应该是唯一的),那么
user\u id
+
date
上的
唯一索引将起作用,我将按照您所说的那样在user\u id+date上使用
唯一索引来修复它。谢谢我要把这个答案标为正确答案。