PHP ile MySQL alan güncelleme ile sorun

8 Cevap php

Ben bir sorgu var:

GÜNCELLEME seçimler + 1 oy = oy SET WHERE choice_id = '$ user_choice'

Ben komut çalıştırmak Ancak, oy alan iki kez güncellenen, oy 5 yerine 4-6 gidecek. Ben sadece bu test şeyler dışında yankı ve çünkü iki kez aradı oluyor ki görünmüyor bir yankı olsun. Böylece PHP sadece "yenileme" kez sayfa başına bu sorguyu yürütmek olacak ona sahip olmak için bir yolu var mı?

EDIT: teşekkürler cevaplar için, ben normal MySQL, hiçbir mysqli veya PDO kullanıyorum. Ben buldum başka bir şey sorgu yaparken, bu 0 ile 1 ve güncelleme ile başlar çalışır, ama o sonra 3 gider, 5, 7 that is ...

8 Cevap

Bir diğer seçenek hiç firefox kullanıyorsanız ve firbug yüklü eğer önbelleğini devre dışı bırakmak için ihtiyaç vardır. DB iki çağrıları nedense firbug sonuçlar için. Test ederken QA garip sonuçlar her türlü başlamıştı gibi nerede iş bu anlamaya hafta sürdü. o kundakçı ile tek oldu.

PHP veritabanı birçok farklı marka için birkaç SQL arayüzleri vardır. Eğer sorguyu yürütmek için kullandığınız PHP kodu gösterilmemiş, ne de kullandığınız veritabanının hangi marka belirledik.

PHP bazı SQL arabirimleri, deyim oluşturma örtülü SQL yürütür. Sonra (bir SELECT deyimi ise) sonuç almak için fırsat var. Beyanı SELECT veya DELETE ise iki kez deyimini yürütmek için gereksiz olsa da, bu, hiçbir zarar yapıldı olasıdır. Lütfen ifadesi bir INSERT veya UPDATE ise, olsa, bunu iki kez etkisi almıştır bulabilirsiniz.

Örneğin, PDO kullanarak:

$pdo = new PDO(...options...);
$stmt = $pdo->query('UPDATE ...'); // executes once
$stmt->execute(); // executes a second time

Sadece votes + 1 gibi etrafına parantez koymak gerekebilir:

UPDATE choices SET votes = (votes + 1) WHERE choice_id = '$user_choice';

Ben de sonunda bir LIMIT 1 koymak olabilir.

Ayrıca, PHPMyAdmin aracılığıyla gibi, PHP dışında sorguyu çalıştıran denedi? Ayrıca, çalıştırmadan önce bütün içinde SQL üzerinden yankılanan deneyin ... Sadece bir hata bulabilirsiniz.

emin OP bu sorunu çözüldü, ama sadece Don tarafından önerilen Firebug sorunu en iyi çözüm gibi görünüyor teyit etmek istiyorum. Benim için çalıştı.

D

Bu sorunun cevabı bir overkill, ama emin (overkill, unutmayın!) MySQL ikili günlükleri sağlayarak, iki kez idam ediyor yapabilirsiniz. Daha sonra bu dosyaları görüntülemek ve sorgu iki kez idam edildi görmek için mysqllog aracını kullanabilirsiniz.

Herkes bir yere kodunuzu iki kez sorgulanan ediliyor :) Ben böyle bir sorgu kullanıyorum ve mükemmel çalışıyor inanıyor. Başka bir şey, benim PEAR_DB nesnesi için bir sarıcı sınıf var. Bu çıkış geçerli sayfayı işlerken kullanılan sorguları (ve damgaları + yığın izleme) can için sordu. Ben (sizinki gibi) yinelenen sorgular ve yavaş güncelleştirmelerini bulmak için kullanabilirsiniz.

İlk olarak düzgün bir sorgu yapmak gerekir:

UPDATE `choices` SET `votes` = `votes` + 1 WHERE `choice_id` = '$user_choice'

Bu sorgu düzgün çalışması gerekir. Belki PHP kodunda hata var ve bu sorgu iki kez yürütür?

Ben sadece bu sorguyu test etmek için bir veritabanı tablo oluşturduk, bunu benim tarafta iyi çalışıyorsa söylemeliyim.

GÜNCELLEME choices SET votes = (oy +1) NEREDE choice_id = '1 '

I think the code my be executed twice in your application, can you try and print out the sql as it is being ran. You can also run the outputted sql statement natively against your database.

Sonuç olarak, sql deyimi sadece uygulama komut katına gayet iyi.

Ben sadece burada tahmin ediyorum ama belki bu kod bir sayfada kullanılan her kaynak için bir kez çalıştırılır? Yani iki kez güncellenen alanda çıkan, hem kaynaklar kez çalıştırmak aynı kodu kullanan bir görüntü veya iframe varsa.

Ben site logo da php ile servis edilir ve ben auto_prepend_file test sayacı güncelleme çünkü benim test karşı iki kez ateş ederim, benim PDO tabanlı oturum işleyicisi bu sadece geçen hafta vardı.