MySQL sorguları dışarı atamaları çekmek için iki düzenli ifadeler kullanarak ve bir denetim izi oluşturmak için bunları kullanıyorum. Bunlardan biri alıntı sütun adları / etc gerektirir 'seçici biridir., Diğeri değil.
Her ikisi de test edilmiş ve doğru değerleri ayrıştırmak edilir. Ben yaşıyorum sorun, belirli bir sorgu ile 'seçici' sıradanifade aslında sadece Apache segfault neden olmasıdır.
Ben bu kodu regexpi bırakarak ve sadece (derleme zaman sorunu falan çeşit ekarte etmek için) çalıştırmak değildi sağlamak için koşullu değiştirerek kadar neden oldu belirlemek için çeşitli şeyler denedik. Sorunları yok. O çalışma sırasında parçalama arızası belirli sorguların karşı regexpi çalışır, ve ben neden bana söylemek için herhangi belirgin bir desen bulamıyorum sadece bu kadar.
Söz konusu kod:
if ($picky)
preg_match_all("/[`'\"]((?:[A-Z]|[a-z]|_|[0-9])+)[`'\"] *= *'((?:[^'\\\\]|\\\\.)*)'/", $sql, $matches);
else
preg_match_all("/[`'\"]?((?:[A-Z]|[a-z]|_|[0-9])+)[`'\"]? *= *[`'\"]?([^`'\" ,]+)[`'\"]?/", $sql, $matches);
Sadece tek tırnak sağlar - İkisi arasındaki tek fark, ilki onları olmayan isteğe yapmak için tırnak üzerindeki soru işaretlerini kaldırır ve değeri tırnak farklı kullanma seçeneği kaldırır. (Deneme amaçlı) ile ikinci ilk regexpi değiştirilmesi ve aynı verileri kullanarak sorunu ortadan kaldırır - bu regexp ile ilgisi definitely şeydir.
The specific SQL that is causing me grief is available at:
http://stackoverflow.pastebin.com/m75c2a2a0
Ben Vurgulanan bölümü kaldırdığınızda İlginçtir ki, bu tüm çalışıyor. Kendisi tarafından vurgulanmış bir bölüm sunmaya çalışırken hiçbir hata neden olur.
Ben çok burada oluyor ne kadar çapraşık ediyorum. Herkes daha fazla hata ayıklama veya bir düzeltme olarak herhangi bir öneri sunabilir?
EDIT: derece heyecan verici bir şey, ama bütünlüğü uğruna burada Apache (/ var/log/apache2/error.log itibaren ilgili günlük girdisi - hiçbir şey sitenin error.log var erişim isteği bile bir söz. log.)
[Thu Dec 10 10:08:03 2009] [notice] child pid 20835 exit signal Segmentation fault (11)
Bu sorguyu içeren her istek için Bunlardan biri.
EDIT2: Kuroki Kaze önerisiyle, ben aynı uzunlukta anlamsız çalıştı ve aynı segfault var. Oturdu ve farklı uzunluklarda bir demet denedim ve sınırı bulundu. 6035 karakterler çalışıyor. 6036 sırasında parçalama arızası.
EDIT3: Changing the values of pcre.backtrack_limit
and pcre.recursion_limit
in php.ini
mitigated the problem somewhat. Apache no longer segfaults, but my regexp no longer matches all of the matches in the string. Apparently this is a long-known (from 2007) bug in PHP/PCRE:
http://bugs.php.net/bug.php?id=40909
Edit4: Ben geçici çözümler benim amaç satılık (ürün için kabul edilemez olduğu gibi bu özel düzenli ifadeyi değiştirmek için kullanılan aşağıda cevapları kod gönderdiniz, php.ini değişiklikleri garanti ve sıradanifade sadece kısmen kaldırıldı işlevselliği çalışma olamaz biz) gerektirir. Ben yayınlanmıştır kodu herhangi bir garanti veya destek ile kamusal alana çıktı. Ben başkası yardımcı olabilir umuyoruz. :)
Yardımlarınız için herkese teşekkürler!
Adem