Hazırlanan tablolarda Özyinelemesi

2 Cevap php

Ben PDO kullanarak ve öncelikle güvenlik nedeniyle bütün tabloların hazırlanmasında oldum. Ancak, does farklı parametrelerle aynı deyimini birçok kez çalıştırmak ve ben hazırlanmış tablolar gerçekten parlaklık bu nerede olacağını düşündüm benim kod parçası var. Ama aslında kodu kırmak ...

Kodun temel mantık budur.

function someFunction($something) {
  global $pdo;

  $array = array();

  static $handle = null;
  if (!$handle) {
    $handle = $pdo->prepare("A STATEMENT WITH :a_param");
  }

  $handle->bindValue(":a_param", $something);
  if ($handle->execute()) {
    while ($row = $handle->fetch()) {
      $array[] = someFunction($row['blah']);
    }
  }

  return $array;
}

Bana gayet iyi görünüyordu, ama bu satırların bir sürü eksik. Sonunda ben deyim tanıtıcı sonra fonksiyon tekrar kendini çağırır, while döngüsünde almak için çağrı sadece bir kere çalışacak anlamına gelir, (farklı param ile idam), ve sonuç kümesi değişti değişti edildiğini fark etti.

Yani PDO kullanarak en iyi yolu, bir özyinelemeli şekilde tablolarını ne merak ediyorum.

Tek yönlü fetchAll () kullanmak olabilir, ama önemli bir yükü vardır kılavuzda diyor. Bu bütün mesele daha verimli hale getirmektir.

Yapabileceğim başka bir şey statik bir kolu yeniden, ve yerine yenisini her zaman yapmak değildir. Ben sorgu dizesi aynı olduğundan, dahili MySQL sürücüsü zaten hazırlanmış deyimi kullanarak olacağına inanıyoruz, böylece her özyineli çağrı üzerine yeni bir kolu oluşturarak sadece küçük yük vardır. Şahsen ben o noktayı yendi düşünüyorum.

Ya da bu yeniden bir yolu var mı?

2 Cevap

Sen iç içe olamaz deyimi kolları: Bir tek oturumda içinde başka bir açmadan önce daha önce açık tanıtıcı kapatmak gerekir.

Otomatik hazırlamak, yeni bir sorunu olduğunda Aslında, PDO yapar.

Özyinelemeli işlevini çağırdığınızda:

  • Ilk kolu ayrılan (1)
  • Ilk kayıt (1) içinde getirilen
  • Işlevi özyinelemeli denir. (1) değer özyineleme yığını bulunur.
  • Yeni tanıtıcı tahsis edilir (2), invalidating (1)
  • Ilk kayıt (2) içinde getirilen
  • Fonksiyonu döner
  • Sen (1) sonraki kaydını almak ve bunun geçersiz beri başarısız deneyin

Böylece MySQL yan özyineleme desteklemez, dedim sen fetchAll kullanılarak, PHP tarafta bunu yapmak zorundasınız demektir.

Asıl sorun $handle statik olmasıdır. Devlet sadece hazırlanmış tablolar için, bir özyinelemeli çağrısı karşısında korunması gereken zaman statik değişkenler yineleme için sorunludur. Bu durumda, özyinelemeli çağrı önceki durumuna atarak, yeni bir sorgu yürütür. Tek hazırlanmış sorgu istiyorsanız PDO::fetchAll gerçekten tek seçenektir.

Ifadesi ne bağlı olarak, potansiyel olarak bundan sonra ağaç bina, bir kerede tüm sonuçları döndürmek için yazabilirsiniz.