Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/58.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 使用准备好的语句更新记录,检查更新是否有效_Php_Mysql_Mysqli_Prepared Statement - Fatal编程技术网

Php 使用准备好的语句更新记录,检查更新是否有效

Php 使用准备好的语句更新记录,检查更新是否有效,php,mysql,mysqli,prepared-statement,Php,Mysql,Mysqli,Prepared Statement,我有一个更新数据库记录的查询,它工作正常,但我想知道如何检查更新是否发生,以便返回true并显示正确的消息 现在我知道,通过选择查询,我可以: if(stmt->fetch()) 如果这是真的,我会返回true并说“records found”,但我不知道如何进行更新查询 有人知道怎么做吗 $query = "UPDATE user SET password = ? WHERE email = ?"; if($stmt = $conn-&

我有一个更新数据库记录的查询,它工作正常,但我想知道如何检查更新是否发生,以便返回true并显示正确的消息

现在我知道,通过选择查询,我可以:

if(stmt->fetch())
如果这是真的,我会返回true并说“records found”,但我不知道如何进行更新查询

有人知道怎么做吗

$query = "UPDATE user
            SET password = ?
            WHERE email = ?";

if($stmt = $conn->prepare($query)) 
{
    $stmt->bind_param('ss', $pwd, $userEmail);
    $stmt->execute();

    //Check if update worked
}

谢谢你的帮助

函数是否适合您?

Execute
方法成功完成后返回True,但是,如果此行为对您来说还不够,您还可以检查:

您可以执行的第二项检查是验证是否恰好更新了1行:

if($stmt = $conn->prepare($query)) 
{
    $stmt->bind_param('ss', $pwd, $userEmail);
    if ($stmt->execute() and $stmt->affected_rows == 1) {
        //your update is succesfully.
    }
}
检查以下各项是否有效:

$query = "UPDATE user
        SET password = ?
        WHERE email = ?";

if($stmt = $conn->prepare($query)) {
    $stmt->bind_param('ss', $pwd, $userEmail);
    if ($stmt->execute()) {
        // Worked...
    } else {
        // Didn't work...
    }
}

虽然晚了几年,但也许这可以帮助某人

正如其他人已经提到的,您可以使用受影响的_行来检查准备语句中的更新查询是否确实更新了任何记录。但是,请注意,如果提交的数据与数据库中的记录相同,“受影响的_行”将返回零(0)


我的一个解决方法是为TIMESTAMP创建一个列,其中包含ON UPDATE CURRENT_TIMESTAMP。然后每次运行查询时,我还将向跟踪时间的列传递一个空值——这样,每次执行查询时都会强制更新行。然后,您所要做的就是检查受影响的_行

你可以马上把它读回来并检查。@rage你知道为什么你目前接受的答案是不正确的吗?您知道您可以移动绿色勾号吗?这是否回答了您的问题?基本的mysql扩展不支持预处理语句,因此OP无法访问mysql\u infected\u rows()函数。。。。假设您的意思是mysqli\u impacted\u rows()代替标题将始终有效。。因为它“尝试”并成功运行了查询(可能影响或不影响行)。为什么它是可接受的答案
$stmt->execute()
只有在某些因素阻止查询执行时才会返回false(即internet连接问题)。它与行是否被更新无关。
$query = "UPDATE user
        SET password = ?
        WHERE email = ?";

if($stmt = $conn->prepare($query)) {
    $stmt->bind_param('ss', $pwd, $userEmail);
    if ($stmt->execute()) {
        // Worked...
    } else {
        // Didn't work...
    }
}