首页 > 解决方案 > 如果没有什么不同,更新不起作用

问题描述

如果我不更改至少 1 个字段值,则更新失败。

插入工作正常。

我的 git https://github.com/emerson-cs-santos/TSI-PI_2-2019/blob/master/PHP/novo_user.php

如果我继续这样做: $status = $status 。' '; 有效,但听起来我是正确的解决方案

-- MYSQL --
CREATE DATABASE IF NOT EXISTS SENAC_PI;

USE SENAC_PI;
CREATE TABLE IF NOT EXISTS USUARIOS 
(
    codigo  INTEGER NOT NULL AUTO_INCREMENT PRIMARY KEY
    ,nome   VARCHAR(20) NOT NULL
    ,senha  VARCHAR(200) NOT NULL
    ,tipo   VARCHAR(20) NOT NULL
)

;


-- PHP --
<?php

// Open a Connection to MySQL
$servername = "localhost";
$username = "root";
$password = "";
$dbname = "SENAC_PI";

// Create connection
$conn = new mysqli($servername, $username, $password,$dbname);

// Check connection
if ($conn->connect_error) 
{
    die("Connection failed: " . $conn->connect_error);
    echo 'errado';
    return;
} 


$query = 'use SENAC_PI';
$result = $conn->query($query);

$codigo = 0;
$login = 'teste';
$senha = '123';
$status = 'Ativo';


$query = 
   " INSERT INTO USUARIOS ( codigo, nome, senha, tipo ) Values (?, ?, ?, ?)";

    $querytratada = $conn->prepare($query); 
    $querytratada->bind_param("isss",$codigo,$login,$senha,$status);

    $querytratada->execute();

    if ($querytratada->affected_rows > 0) 
    {
        $resposta = 'ok';
    } 
    else 
    {
        $resposta = 'erro';
    }


-- update
    $query = 
    " UPDATE USUARIOS SET nome = ? ,senha = ? , tipo = ? where codigo = ? ";
    $querytratada = $conn->prepare($query); 
    $querytratada->bind_param("sssi",$login,$senha,$status,$codigo);

    $querytratada->execute();

    if ($querytratada->affected_rows > 0) 
    {
        $resposta = 'ok';
    } 
    else 
    {
        $resposta = 'erro';
    }

}

?>

如果我不更改至少 1 个字段值,则查询返回:affected_rows = 0

标签: phpmysql

解决方案


感谢Nigel,我设法验证了结果。

我使用“affected_rows”来验证错误,但如果用户没有更改某些内容,我的代码将作为错误返回。

使用“匹配的行”“警告”,我可以确保我的查询没有错误

我的问题的最终代码: preg_match_all ('/(\S[^:]+): (\d+)/', $conn->info, $querytratada); $info = array_combine ($querytratada[1], $querytratada[2]);

// Linhas encontradas com base na condição da where
$linhas_encontradas = $info['Rows matched'];

// Linhas que foram alteradas, quando os dados não forem alterados, mesmo o comando estando certo, não é retornado linhas afetadas
$linhas_afetadas = $info['Changed'];

// Avisos de problemas
$avisos_problemas = $info['Warnings'];

//if ($querytratada->affected_rows > 0) 
if ($linhas_encontradas == '1' and $avisos_problemas == '0')
{
    $resposta = 'ok';
} 
else 
{
    $resposta = 'erro';
}

无论如何,再次感谢奈杰尔!


推荐阅读