2013-03-17 9 views
5

MySQL Reference Manual'da, veri tanımı ifadeleri ve veri işleme deyimleri arasında ayrım vardır.PDO'da bir sorgu deyiminin türü nasıl alınır?

Artık bir sorgu bir veritabanı kaydını ekleyip eklemediğini, bir tane siler veya tablo yapısını değiştirip değiştirmeyeceğini veya daha kesin olarak, etkilenen satırların tam sayısını değil, yalnızca uygulanabilirse bilmek istiyorum. Örneğin

, deyim

SELECT * 
FROM SomeTable 
WHERE id=1 OR id=2 

(bu durumda cinsinden) etkilenen satır sayısını verir, ancak bu sayı olurdu böylece SELECT açıklamada, veritabanında değiştirilen hiçbir şey yoktur 0.

Sorgu türü nasıl alınır?

+1

gibi çok sözcüklü deyim türleri değil 'substr ($ query, 0, 6)' ile ilgili sorun nedir? –

+0

Ayrıca bir "EXPLAIN" sorgusuna önek ekleyebilirsiniz? – hjpotter92

+1

@downvoters: Lütfen bu yazıyla ilgili görüşlerinizi bir yorumda bırakın. –

cevap

8

Aynı cevabı arıyordum ve this article arasında tökezledim. En son Ağustos ayında güncellendi. Temelde aşağıdaki varsayımlar yapabilir "bir Beyanı Tipi Belirleme": (makaleden kopyalanan) columnCount() sıfırsa

  • , deyim bir sonuç vermedi İçinde bir bölümü vardır ayarlayın. Bunun yerine, satırları değiştirdi ve etkilenen satırların sayısını belirlemek için rowCount() yöntemini çağırabilirsiniz.
  • columnCount() öğesi sıfırdan büyükse, ifade bir sonuç kümesi oluşturdu ve satırları getirebilirsiniz. Kaç tane satır olduğunu belirlemek için, onları getirirken sayın.

Sana zahmetten kurtarıp sadece burada bu kullanıyorum

$sth = $dbh->prepare ($stmt); 
$sth->execute(); 
if ($sth->columnCount() == 0) 
{ 
    # there is no result set, so the statement modifies rows 
    printf ("Number of rows affected: %d\n", $sth->rowCount()); 
} 
else 
{ 
    # there is a result set 
    printf ("Number of columns in result set: %d\n", $sth->columnCount()); 
    $count = 0; 
    while ($row = $sth->fetch (PDO::FETCH_NUM)) 
    { 
    # display column values separated by commas 
     print (join (", ", $row) . "\n"); 
     $count++; 
    } 
} 
4

Aynı meseleyi düşünüyordum ve bu konuda otomasyona ihtiyacım olmadığı sonucuna vardım.

Böyle bir otomatik algılamayı kullanmanın tek yolu, etkilenen satırların sayısını döndürecek bazı sihirli işlevlerdir. Ama böyle bir sihir, sözdizimine biraz şeker eklemesine rağmen, her zaman kod desteğini bir kâbus kılar:
Bir işlevi çağırıyorsanız ve farklı türlerin değerlerini bağlama göre döndürebiliyorsa, hangisi olduğunu söyleyemezsiniz. her an döndü. Yani, hata ayıklamayı zorlaştırır.

Yani, okunabilirlik amacıyla, şu anda ihtiyacınız olan sonucu elde etmek için uygun işlevi çağırın - etkilenen Rakamlar veya Sayısal Sayılar. Kodunuzu şişirmez, ancak 'u çok okunabilir hale getirin.

-1

kod örneğini yapıştıracaksınız:

$ deyimi bir PDOStatement nesnesi olan
substr($statement->queryString, 0, strpos($statement->queryString, ' ')); 

, birkaç Burada dikkat etmeniz gerekenler, $ ifadesinin bir PDOStatement nesnesi olduğunu doğrulamadan önce doğrulamanız gerektiğidir, muhtemelen bir hataya neden olacak şekilde strpos'un yanlış döndürülmesi durumunda muhtemelen substr ifadesinin strposunu almalıyız, bu da muhtemelen bir hataya neden olacaktır. w SELECT, INSERT, vb. gibi tek kelimelik bir deyim türü ve ALTER TABLE

İlgili konular