如果语句条件未运行

时间:2016-12-29 17:25:23

标签: php mysql if-statement

我正在检查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

4 个答案:

答案 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而不是?,因为它们更容易跟踪,但这当然是一种观点问题,我觉得很多人也不同,而不仅仅是我自己

<强>脚注/币:

我还想赞扬以下评论:

  

“如果你总是陷入更新表明$ page_count不为零..尝试echo()它看到可能..我可能会首先尝试将另一个用户添加到click_count表中然后它可能会变成更容易看出它出错的地方.. - johnyTee“

OP回复的地方是:

  

“@ Fred-ii-我明白了。我使用了johnyTee的建议,并尝试手动将另一个用户添加到数据库中,因为page_url列的唯一索引,它不会让我。我随后删除了从它的独特索引,现在它完美的工作。感谢您的帮助! - 保罗“

答案 1 :(得分:0)

可能是&#39; 0&#39; 0 (一个字符串)。您可以使用intval将其转换为整数。

$page_count = intval( $click_stmt->rowCount() );

http://php.net/manual/en/function.intval.php

答案 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
    }
}
相关问题