Pourquoi PDO rowCount () renvoie 0 après UPDATE une table sans modifier les données existantes?
Je suis de la lecture d'un tutoriel sur la façon d'insérer et mettre à jour des données dans une table MySQL à l'aide de PHP, le code est donné ci-dessous. Mon problème est que lorsque je clique sur mise à jour mais je n'ai pas modifié les données, rowCount() retourne 0 et rompt le code.
Ma question est, Si je suis tout simplement la mise à jour de la base de données avec les mêmes valeurs qui sont à la base de données, pourquoi ne rowCount() renvoie zéro? Mes pensées étaient que même si c'était les mêmes données, il serait inséré de toute façon et retourner un nombre de lignes mises à jour? Je suppose que c'vérifier les données avant d'essayer de le mettre à jour? Quelqu'un peut-il éclairer sur ce pour moi et de proposer une solution de contournement? J'ai été en vedette sur le code pour les heures et ont été incapables de trouver quoi que ce soit, merci.
<?php
require_once('../includes/connection.inc.php');
//initialize flags
$OK = false;
$done = false;
//create database connection
$conn = dbConnect('write', 'pdo');
if (isset($_GET['article_id']) && !$_POST) {
//prepare sql query
$sql = 'SELECT article_id, title, article FROM blog WHERE article_id = ?';
$stmt = $conn->prepare($sql);
//bind the results
$stmt->bindColumn(1, $article_id);
$stmt->bindColumn(2, $title);
$stmt->bindColumn(3, $article);
//execute query by passing array of variables
$OK = $stmt->execute(array($_GET['article_id']));
$stmt->fetch();
}
//if form has been submitted, update record
if (isset($_POST['update'])) {
//prepare update query
$sql = 'UPDATE blog SET title = ?, article = ? WHERE article_id = ?';
$stmt = $conn->prepare($sql);
//execute query by passing array of variables
$stmt->execute(array($_POST['title'], $_POST['article'], $_POST['article_id']));
$done = $stmt->rowCount();
}
//redirect page on sucess or if $_GET['article_id'] not defined
if ($done || !isset($_GET['article_id'])) {
header('Location: http://localhost/PHP_Solutions/admin/blog_list_pdo.php');
exit();
}
//store error message if query fails
if (isset($stmt) && !$OK && !$done) {
$error = $stmt->errorInfo();
if (isset($error[2])) {
$error = $error[2];
}
}
?>
<!DOCTYPE HTML>
<html>
<head>
<meta charset="utf-8">
<title>Update Blog Entry</title>
<link href="../styles/admin.css" rel="stylesheet" type="text/css">
</head>
<body>
<h1>Update Blog Entry</h1>
<p><a href="blog_list_pdo.php">List all entries </a></p>
<?php if (isset($error[2])) {
echo "<p class='warning'>Error: $error[2]</p>";
echo '<pre>';
print_r($_POST);
print_r($error);
echo '</pre>';
}
if ($article_id == 0) { ?>
<p class="warning">Invalid request: record does not exist.</p>
<?php } else { ?>
<form id="form1" method="post" action="">
<input name="article_id" type="hidden" value="<?php echo $article_id; ?>">
<p>
<label for="title">Title:</label>
<input name="title" type="text" class="widebox" id="title" value="<?php echo htmlentities($title, ENT_COMPAT, 'utf-8'); ?>">
</p>
<p>
<label for="article">Article:</label>
<textarea name="article" cols="60" rows="8" class="widebox" id="article"><?php echo htmlentities($article, ENT_COMPAT, 'utf-8'); ?></textarea>
</p>
<p>
<input type="submit" name="update" value="Update Entry" id="update">
</p>
</form>
<?php } ?>
</body>
</html>
source d'informationauteur Drewdin
Vous devez vous connecter pour publier un commentaire.
rowCount est le comptage du touchés lignes par une requête. Comme vous n'avez pas changé quoi que ce soit, il y a zéro le nombre de lignes affectées.
Il n'a rien à voir avec le PHP, c'est juste la façon dont MySQL fonctionne.
MySQL documentations dit:
Lorsque vous utilisez l'instruction de mise à JOUR, et de vous présenter les mêmes valeurs qui sont à la base de données, il retournera toujours à zéro, car il n'a pas touché une ligne.
Un moyen de résoudre ce problème est:
Ce que j'ai fait?
Je n'ai que:
Parce que si rowCount() est égale à zéromais $stmt a exécuté sans erreurs$stmt a été exécuté, mais n'a rien changé.
C'est comment MySQL fonctionne et n'a intrinsèquement rien à voir avec l'extension PDO; effectuer régulièrement une requête mysql serait de produire les mêmes résultats. Il existe une solution de contournement que j'ai trouvé en utilisant les fonctions de mysql, même si je ne suis pas sûr si vous pouvez faire quelque chose de semblable avec un objet PDO.
Espère que cela aide un peu.