我正在检查user_id(它在会话中保存) - 这是有效的。然后我为数据库表SELECT
的该用户运行click_count
查询。我正在检查该用户是否有任何记录,即:$page_count
。如果没有,我希望运行INSERT
语句以将该用户与其他数据一起添加到数据库表中。
我不明白的部分似乎是我的UPDATE
查询始终在运行。例如,无论我使用我的查询登录哪个用户,只更新数据库表中的唯一用户。 IE:Bob是click_count表中唯一的用户,如果我使用Pete登录,Bob的记录正在更新。
我已经测试了$page_count
的值,它等于0,所以我的INSERT
应该正在运行。我也试过if ($page_count === 0) {
有人看到我遗失的任何东西吗?
$curPage = $_SERVER['PHP_SELF'];
$clicks = 0;
$setup = 0;
$page_total_count = 0;
var_dump($user_id);
$click_sql = "
SELECT *
FROM click_count
WHERE user_id = ?
AND page_url = ?
";
$click_stmt = $con->prepare($click_sql);
$click_stmt->execute(array($user_id, $curPage));
$click_stmt_rows = $click_stmt->fetchAll(PDO::FETCH_ASSOC);
$page_count = $click_stmt->rowCount();
foreach ($click_stmt_rows as $click_stmt_row) {
$setup_status = $click_stmt_row['setup'];
$page_total_count = $click_stmt_row['page_count'];
}
if ($page_count == 0) {
$click_insert_sql = "
INSERT INTO click_count
(user_id, page_url, page_count, setup)
VALUES(?, ?, ?, ?)
ON DUPLICATE KEY UPDATE page_count=page_count+1;
";
$click_insert_stmt = $con->prepare($click_insert_sql);
$click_insert_stmt->execute(array($user_id, $curPage, 1, $setup));
}
else {
$click_update_sql = "
UPDATE click_count
SET page_count=page_count+1
WHERE user_id = ?
AND page_url = ?
";
$click_update_stmt = $con->prepare($click_update_sql);
$click_update_stmt->execute(array($user_id, $curPage));
}
表
click_count
CREATE TABLE `click_count` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`user_id` int(11) NOT NULL,
`page_url` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
`page_count` int(11) NOT NULL,
`setup` int(5) NOT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `user_id` (`user_id`),
UNIQUE KEY `page_url` (`page_url`)
) ENGINE=MyISAM AUTO_INCREMENT=2 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci
答案 0 :(得分:3)
由于表中只有一个用户,因此没有“插入/更新”记录,因此
ON DUPLICATE KEY UPDATE
默默地 。
常规UPDATE就足够了:
即。作为一个例子:
UPDATE table SET col_x = 0|1 WHERE col_y = ? // (boolean 0-1)
注意:
如果您希望稍后通过计算来增加列,则语法为:
UPDATE table SET col_x = col_x + 1 WHERE col_y = ?
关于如何改进代码的问题:
@ Fred-ii-谢谢。是的,它现在正在按我的意愿工作,但如果有方法可以改进代码,我总是愿意尝试去学习它。我只记得过去的人说我根本没有重复密钥更新需要更新查询。 - 保罗
您可以使用命名占位符:name
而不是?
,因为它们更容易跟踪,但这当然是一种观点问题,我觉得很多人也不同,而不仅仅是我自己
<强>脚注/币:强>
我还想赞扬以下评论:
OP回复的地方是:“如果你总是陷入更新表明$ page_count不为零..尝试echo()它看到可能..我可能会首先尝试将另一个用户添加到click_count表中然后它可能会变成更容易看出它出错的地方.. - johnyTee“
“@ Fred-ii-我明白了。我使用了johnyTee的建议,并尝试手动将另一个用户添加到数据库中,因为page_url列的唯一索引,它不会让我。我随后删除了从它的独特索引,现在它完美的工作。感谢您的帮助! - 保罗“
答案 1 :(得分:0)
可能是&#39; 0&#39; 0 (一个字符串)。您可以使用intval将其转换为整数。
$page_count = intval( $click_stmt->rowCount() );
答案 2 :(得分:0)
来自PHP PDO doc http://php.net/manual/en/pdostatement.rowcount.php
PDOStatement :: rowCount()返回受a影响的行数 DELETE,INSERT或UPDATE语句。
如果你需要选择行数,你应该使用像
这样的东西$sql = "SELECT *
FROM click_count
WHERE user_id = ?
AND page_url = ?
";
$result = $con->prepare($sql);
$result->execute();
$number_of_rows = $result->fetchColumn();
答案 3 :(得分:0)
对于大多数数据库,PDOStatement :: rowCount()不返回受SELECT语句影响的行数。相反,使用PDO :: query()发出带有与预期SELECT语句相同的谓词的SELECT COUNT(*)语句,然后使用PDOStatement :: fetchColumn()来检索将返回的行数。然后,您的应用程序可以执行正确的操作。
尝试这样:
$sql = "SELECT count(*)
FROM click_count
WHERE user_id = ?
AND page_url = ?
";
if ($res = $conn->query($sql)) {
/* Check the number of rows that match the SELECT statement */
if ($res->fetchColumn() > 0) {
//insert
}else {
//update
}
}