2011-06-04 8 views
15

PHP kullanarak bir MySQL tablosuna veri ekleme ve güncelleme hakkında bir öğretici okuyorum, kod aşağıda listelenmiştir. Sorunum, tıklamayı güncellediğimde ancak herhangi bir veriyi değiştirmediğimde, rowCount() 0 değerini döndürür ve kodu bozar.PDO rowCount(), varolan verileri değiştirmeden bir tabloyu UPDATE sonra 0'a neden dönüyor?

Sorum şu ki, veritabanını veritabanında aynı değerlerle güncelleştiriyorsam, rowCount() neden sıfır döndürüyor? Düşüncelerim, her ne kadar aynı veri olsa da, zaten eklenecek ve güncellenmiş satırların sayısını döndürecek miydi? Güncellemeyi denemeden önce verileri kontrol ettiğini tahmin ediyorum? Bu konuda bana biraz ışık tutabilir ve bir geçici çözüm önerebilir mi? Kodda saatlerce oynadım ve hiçbir şeyle gelemedim, teşekkürler. Sadece neden rowCount() sıfır çıkmıyor, veritabanında aynı değerlerle veritabanını güncelleyerek am mı

<?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> 

cevap

19

Sorum şu,?

rowCount bir sorgu ile etkilenen satır sayılmasıdır. Hiçbir şey değiştirmediğiniz için, sıfır etkilenen satır var.

PDOStatement->rowCount - Son SQL deyiminden O PHP ile ilgisi yoktur

+0

ama aynı verileri tekrar satırlara ekliyorum, veri var, sadece aynı veriler var. Farkı nasıl biliyor? Teşekkürler – Drewdin

+0

Eklemiyorsunuz, güncelleniyorsunuz. Büyük bir fark var ve SQL sunucuları herhangi bir iş yapıp yapmadıklarını bilmek için yeterince akıllılar. Verileri art arda değiştirmezseniz, 'etkilenen' olarak kabul edilemez. – ceejayoz

+0

Verilerin değiştirilmediğini kontrol etmenizi nasıl öneriyorsunuz? Teşekkürler – Drewdin

9

etkilenen satır sayısını döndürür - bu MySQL böyle çalıştığını. UPDATE tablolar için

MySQL documentations says:

, varsayılan olarak etkilenen-satırlar değer satır sayısı aslında değişmiş olduğunu. CLIENT_FOUND_ROWS işaretini mysqld'a bağlanırken mysql_real_connect() işaretini belirtirseniz, etkilenen satırların değeri "bulunan" satır sayısıdır; WHERE yan tümcesi ile eşleştirilir.

+0

Takdir ediyorum, nasıl çalıştığını anlamadım. Teşekkürler – Drewdin

+3

PDO sürümü: '$ bağlantı = yeni PDO ($ data_source, $ kullanıcı, $ şifre, dizi (PDO :: MYSQL_ATTR_FOUND_ROWS => doğru))' –

2

MySQL'in nasıl çalıştığını ve PDO uzantısıyla gerçekte hiçbir ilgisi olmadığı; Düzenli bir mysql sorgusu yapmak aynı sonuçları üretecektir. Bir PDO nesnesine benzer bir şey yapıp yapamayacağınızdan emin olmasam da, mysql işlevlerini kullanarak bulduğum bir geçici çözüm var.

$q = 'UPDATE etc...'; 
$r = mysql_query($q, $con); 
$info = mysql_info(); // Returns info about last query. 

list($matches, $changed, $warnings) = sscanf($matched, "Rows matched: %d Changed: %d Warnings: %d"); 

if ($matches > 0) {} // etc 

Bu biraz yardımcı olur umarım.

+0

Hem mysqli hem de pdo sürümleri var teşekkürler, bunu deneyin – Drewdin

3

UPDATE deyimini kullandığınızda ve veritabanındaki aynı değerleri gönderdiğinizde, her zaman sıfıra döner, çünkü herhangi bir satırı etkilemez.

Bu sorunu çözmek için bir yoldur: i ne yaptık

$done = $stmt !== false ? true : false; 

? yaptım:

if($stmt !== false){ 
    $done = true; 
} else{ 
    $done = false; 
} 

Çünkü rowCount() sıfır ama $ stmt hataları olmadan yürüttü , eğer $ idam edildi Stmt, ancak hiçbir şey değişmedi.

İlgili konular