SQL Sorgu: 1 yerine iki ile artırım

13 Cevap php

Ben, 1 ile tamsayı değeri artan bir tablodaki bir alanı güncelleştirmek için çalışıyorum İşte kullanıyorum budur.:

function updateViews($id){

$sql = "UPDATE tweets SET tweet_views = tweet_views + 1 WHERE tweet_key = '$id'";

$result = mysql_query($sql) or die("DB Error : ". mysql_error());

return $result;

}

Ancak, 2 ile 1 ziyade her zaman kendi artımlı bulmak? Ben yanlış ne yapıyorum?

Teşekkürler

Update

Cevaplardan SQL doğrudur. Bu yeniden yazma motoru tarafından etkilenmiş olabilir sizce?? Ben bu iki komut vardır çünkü ben çağrı yapmayın kez çalıştırmak ya da değil% 100 eminim çünkü ben soruyorum. Fonksiyonunu tutan işlevini ve birini çağıran biri! Bu kafa karıştırıcı.

Update 2

Ayıklama işlevini kullanma. Ben bu çıktıyı alıyorum:

array(4) {
  ["file"]=>
  string(35) "/home/magic/public_html/dbUpdate.php"
  ["line"]=>
  int(16)
  ["function"]=>
  string(15) "myDebugFunction"
  ["args"]=>
  array(0) {
  }
}

array(4) {
  ["file"]=>
  string(31) "/home/magic/public_html/view.php"
  ["line"]=>
  int(10)
  ["function"]=>
  string(11) "updateViews"
  ["args"]=>
  array(1) {
    [0]=>
    &string(5) "7jjdd"
  }
}

Dosyası bir kez çağrıldığını, ancak yine de iki kez güncellenir oluyor sanki görünüyor?? YARDIM! (

Ayrıca Log dosyasından komut üç kez aradı ediliyor, sanki görünüyor?

13:16:28 id:4a6c9d7cf38016.29304000
  _SERVER[REQUEST_URI]=/lucic
  _SERVER[REDIRECT_URL]=/lucic
  /home/magic/public_html/dbUpdate.php@16 :myDebugFunction
  /home/magic/public_html/view.php@10 :updateViews
13:16:30 id:4a6c9d7eaf93e3.88114161
  _SERVER[REQUEST_URI]=/lucic
  _SERVER[REDIRECT_URL]=/lucic
  /home/magic/public_html/dbUpdate.php@16 :myDebugFunction
  /home/magic/public_html/view.php@10 :updateViews
13:16:31 id:4a6c9d7f846557.12618673
  _SERVER[REQUEST_URI]=/lucic
  _SERVER[REDIRECT_URL]=/lucic
  /home/magic/public_html/dbUpdate.php@16 :myDebugFunction
  /home/magic/public_html/view.php@10 :updateViews

UPDATE 3

Burada bir sorun neden olabilir benim htaccess dosyasının içeriği olduğunu.

# REWRITE DEFAULTS
RewriteEngine On
RewriteBase /

RewriteCond %{HTTP_HOST} ^www\.mysite\.com$ [NC]
RewriteRule ^(.*)$ http://mysite.com/$1 [R=301,L]

# /view.php?t=h5k6 externally to /h5k6
RewriteCond %{THE_REQUEST} ^GET\ /view\.php
RewriteCond %{QUERY_STRING} ^([^&]*&)*t=([^&]+)&?.*$
RewriteRule ^view\.php$ /%2? [L,R=301]

# /h5k6 internally to /view.php?t=h5k6
RewriteRule ^([0-9a-z]+)$ view.php?t=$1 [L]

13 Cevap

Burada çıkan sayfada HTML dahil etmek isteyebilirsiniz. Olası bir betik, bağlantı (css) veya img düzgün biçimlendirilmiş değil ve sadece "", "#" ya da "varlık tarafından yeniden yazma biniyorlar?" beri aynı url için bu irade 'çözmek'. Mutlak-pathing bazı kişilere düşen olabilir adresler (images / header.gif yerine / images / header.gif, vb), tüm değilseniz özellikle bir tarayıcıya beri bu kısa URL'ler dizinleri gibi görünüyorsun. (Yansıtma olmadan, sadece basit bir GET) curl isteği yaparken deneyin ve orada olur bakın.

Ayrıca HTTP erişimi açmak ve günlük yeniden ve bu düzeyde oluyor ne (bkz. not, derlenmiş config RewriteLog direktiflerini koymak zorunda, bu alışkanlık bir. Htaccess çalışmak). Bu başarısız, gerçek istekleri yapılıyor görmek için, daha iyi TamperData veya Wireshark'da gibi bir şey isteği izleyebilirsiniz.

Düşünmek başka şeyler: apache conf MultiViews On bir eki uzantısı eklemek için çalışıyor olabilir ve (emin değilim nasıl, ama kim bilir) sizin yazımının tarafından tuhaf bir şekilde yakalandığını olabilir - ve yeniden yazma günlük olduğunu gösterecektir. mod_dir bir bölü (bu kısa URL'ler tür dizinleri gibi bakmak beri) olsa da, muhtemelen bu görürdünüz eklemek için çalışıyor olabilir.

Yanlışlıkla birden fazla sorguyu yayınlanıyor. :)

(Tamam, sadece bir tahmin şu, ama emin olmak için bazı günlük öneririm)

Eğer işlev bazı hata ayıklama günlüğü ile iki kez ya da komut denir olmadığını test edebilirsiniz.

function myDebugFunction() {
  static $iid = null;

  if ( is_null($iid) ) {
    $iid = uniqid('', true);
  }

  $log = date('H:i:s').' id:'.$iid."\n".
    "  _SERVER[REQUEST_URI]=". @$_SERVER['REQUEST_URI']."\n" .
    "  _SERVER[REDIRECT_URL]=". @$_SERVER['REDIRECT_URL'];
  foreach(debug_backtrace() as $bt) {
    echo '<pre>'; var_dump($bt); echo '</pre>';
    $log .= "\n  ".$bt['file'].'@'.$bt['line'].' '.@$bt['class'].':'.$bt['function'];
  }
  $log .= "\n";
  error_log($log, 3, 'mydebug.log');
}

function updateViews($id) {
  myDebugFunction();
  $sql = "
    UPDATE
      tweets
    SET
      tweet_views = tweet_views + 1
    WHERE
      tweet_key = '".mysql_real_escape_string($id) ."'
  ";
  $result = mysql_query($sql) or die("DB Error : ". mysql_error());
  return $result;
}

Eğer fonksiyonu mydebug.log iki kez aynı id bulursanız kez (aynı php örneği içinde) adı olmuştur. Aksi takdirde komut iki kez çağrılan olmuştur.

Dahil hiçbir tetikleyici, orada mi?

Eğer görüyorsanız sorun için hesap olabilir yanlış bir form POST sonra GET verir bazı güncel tarayıcılar (I Chrome onlardan biri olduğunu düşünüyorum), vardır.

Siz de php uygulama istekleri oturum ve tarayıcıdan iki isabet eğer görebilir miyim?

SQL doğrudur. Ben PHP iz ve SQL çalışır işlevi yinelenen bir çağrı olmadığını emin olur.

Bu sayfada bir hata işleme sayfası var mı?

REDIRECT_URL ErrorDocuments veya benzer tutarken apache tarafından belirlenen bir değişken gibi görünüyor çünkü REDIRECT_URL REQUEST_URI olarak aynı olduğu gerçeği böylece göstermektedir.

. Senin htaccess dosyasında ne var - dosyanın gerçekten bazı yönlendirme döngü meydana edilebilir bir kereden fazla yürütülüyor gibi görünüyor göz önüne alındığında?

EDIT: yolu daha bilgi burada var: http://onlamp.com/pub/a/onlamp/2003/02/13/davidsklar.html?page=last

sadece bir tahmin, ama bir virüs tarayıcı yüklü var mı? Bazen bir sayfa prefetch - böylece iki hit sonuçlanır. Lütfen access.log de o bakmak için kontrol etmek için.

i veritabanı tarafında bu işlemek için bir sproc / tetikleyici oluşturmak istiyorum.

(Bir düğmeye tıklama gibi) belirli bir olayı sayfanızdan sproc diyoruz.

Sorununuz beklenmedik tarayıcınızın refresh den olabilir ya da veritabanı tarafında kapsam hatası olabilir.

Bir saklı yordam olarak kodunuzu yeniden tasarlama sorunu çözmek ya da sorun doğan nerede olduğunu anlamaya yardımcı olmalıdır ya.

Dosyanın kodlama kontrol edin. Tarayıcı sayfasında ASCII olmayan harfler bulursa, o zaman başka bir kodlama ile sayfayı yeniden olabilir. ASCII olmayan harfler, Rusça, Çince veya İbranice harfleri ÆØÅ olabilir. Eğer kodlamayı belirtir bir meta etiketi olsa bile, tarayıcı hala sayfayı yeniden yükleyin ve yeniden işleme başlayacak.

Bu sorun, bir gelişmiş tarayıcı (notepad + + örneğin) dosyanızı açın ve kodlaması belirtmek düzeltmek için. Not Defteri'nde + + bu UTF-8 Biçim> Encode olduğunu. Eğer Format kullanırsanız> UTF-8 dönüştürme, bazı garip bayt belgenin başında görünebilir, bu yüzden Encode yöntemi kullanmak daha güvenlidir.

Eğer Smarty kullanıyor musunuz?

--edit-- I asked this because Smarty has a bug, when you have an img tag without a src defined in the template, the base index.php will be included twice.

Tabanı script sayfanın sadece bir yenileme iki kez (veya daha fazla) görüntülenir olsun olabilir gibi, bir img (Eğer eski için olabilir) veya aynı sayfaya bir iframe varsa aynı olur ca.

Sadece rastgele: Lütfen sayfa son yorumlar, fiyatlar, güncelleştirmeler vs almak için, herhangi bir auto-refresh/reload özellikleri var mı? Yani ne görüyorsanız yapabilir, hangi sayfanın ikinci bir yükleme neden olabilir.

Ayrıca, herhangi bir AJAX kullanıyorsunuz?

Eğer header("location: xxxxx") sayfanızda herhangi bir yere yönlendirir (veya yer sayfa) kullanıyor musunuz? Eğer aramadan bunları kullanırsanız exit() hemen sonra, komut dosyası çalıştırmak için devam edecektir.

Bazı $_SESSION değişkeni, daha sonra header() yönlendirme kullanarak aynı sayfaya yönlendirir ayarlar dahil bir sayfasında bir giriş kontrol varsa Örneğin, bu mümkün olduğunu fonksiyon {[ (2)]} senaryonun kalanı hala updateViews() fonksiyonu ile sayfa dahil, idam alacak anlamına gelir, sonra çağrılmadı. Herhangi bir veri tarayıcıya çıktı önce istemci tarafında bu yönlendirme çünkü Ancak, kullanıcı bu görmezsiniz.

Biz bütün script doğrulamak görebilir miyim?