Opencart'da "Error while sending QUERY packet. PID=" Hatası ve Çözümü


PHP Warning:  Error while sending QUERY packet. PID=29811 in /public_html/system/library/db/mpdo.php on line 57 gibi bir hata alıyorsanız bunun nedeni sorgulamalarınızın izin verilen maksimum değeri geçmesi olabilir. 

Bu hatanın çözümü için, ilgili dosyaya (system/library/db/mpdo.php) aşağıdaki satırı eklemenizi öneririm:
$this->connection->exec("SET GLOBAL max_allowed_packet=524288000");

Ben bu şekilde sorunu çözdüm. Kodu eklediğinizde aşağıdaki gibi olacaktır:

public function __construct($hostname, $username, $password, $database, $port = '3306') {
    try {
        $this->connection = new \PDO("mysql:host=" . $hostname . ";port=" . $port . ";dbname=" . $database, $username, $password, array(\PDO::ATTR_PERSISTENT => true));
    } catch(\PDOException $e) {
        throw new \Exception('Failed to connect to database. Reason: \'' . $e->getMessage() . '\'');
    }

    $this->connection->exec("SET NAMES 'utf8'");
    $this->connection->exec("SET CHARACTER SET utf8");
    $this->connection->exec("SET CHARACTER_SET_CONNECTION=utf8");
    $this->connection->exec("SET SQL_MODE = ''");
    $this->connection->exec("SET GLOBAL max_allowed_packet=524288000");
}


MYSQL Sayısal(int) Değerlerin Farkları


Tinyint, Smallint, Mediumint, Int, Bigint alanları arasındaki farklar:


          | Byte     Range(signed)                                Range (unsigned)
--------------------------------------------------------------------------------------------
tinyint   | 1 byte   -128 to 127                                  0 to 255
smallint  | 2 bytes  -32768 to 32767                              0 to 65535
mediumint | 3 bytes  -8388608 to 8388607                          0 to 16777215
int       | 4 bytes  -2147483648 to 2147483647                    0 to 4294967295
bigint    | 8 bytes  -9223372036854775808 to 9223372036854775807  0 to 18446744073709551615

Opencart Sık Kullanılan MYSQL Sorguları

Mağazanızdaki ürünlerin bilgilerinde toplu olarak bir değişiklik yapmanız gerektiğinde mysql database üzerinde çalıştıracağınız örnek update sorguları aşağıdadır.

Ürün Adında Toplu Güncelleme Yapma:
UPDATE oc_product_description SET name = REPLACE(name, 'Sarı Defter', 'Yeşil Defter') WHERE INSTR(name, 'Sarı Defter') > 0
Böylece tüm ürün adında "Sarı Defter" geçenler "Yeşil Defter" olarak güncellenir. Örneğin "Kareli Sarı Defter" --> "Kareli Yeşil Defter" haline gelir.


Ürün Açıklamasında Toplu Güncelleme Yapma:
UPDATE oc_product_description SET description = REPLACE(description, 'Bağımsız tabakalar halindedir', 'Bağımsız yapraklar halindedir') WHERE INSTR(description, 'Bağımsız tabakalar halindedir') > 0
Böylece text içindeki bir kelime veya cümleyi değiştirebilirsiniz.


Ürün Açıklamasında Toplu Güncelleme Yapma (Ürün Adına Göre Arayarak):
UPDATE oc_product_description SET description = REPLACE(description, '%100 pamuklu tuval bezi, köknar ağacından üretilir', '%90 pamuklu tuval bezi, çınar ağacından üretilir') WHERE INSTR(name, 'Basic Seri Tuval') > 0


Birden Fazla Ürünün Durumunu Tek Seferde Güncelleme:
Product ID'leri belli olan birden fazla ürünün durumunu tek seferde güncellemek için:
UPDATE oc_product SET status = 0 WHERE product_id IN (1563,1564,1566,1607,1617,1620)


Ürün seçenek tablosunda çift girilmiş verileri bulma:
Hatalı olarak iki kere girilen verileri bulmak için:
SELECT name, COUNT(*) c FROM oc_option_value_description WHERE language_id=2 GROUP BY name HAVING c > 1


Ürün fiyatlarını toplu güncelleme:
Örneğin ürün kodunda digital geçmeyenlerin fiyatını %15 arttırmak için:
UPDATE oc_product SET price = (price * 1.15) WHERE model NOT LIKE '%digital%'



Son Güncelleme: 8/12/2021

Wordpress: Veritabanına kayıt limiti


Yeni kayıt ekleyemiyorum:
Wordpress panelinden yazı, sayfa veya herhangi bir plugin içinde yeni bir kayıt eklemek istediğinizde olmuyorsa, bunun nedeni php.ini dosyasında belirlenen input limiti olabilir (max_input_vars). Bu değeri arttırarak sorunu çözebilirsiniz. Fakat bazen php.ini dosyasına erişmek imkansız olabiliyor. Bu nedenle htaccess yöntemini önereceğim.

Çözüm:
- Öncelikle Cpanel > Select PHP Version > Php 7 olarak belirleyin.
- Cpanel > Dosya Yöneticisi > .htaccess dosyasını açın. Dosya yönetecisi ayarlarında "Gizli dosyaları göster" açık olmalıdır. Yinede yoksa kendiniz oluşturun.
- Şu kodu htaccess dosyanızın en sonuna ekleyin:
#maksimimum kayıt sayısını arttırma
php_value max_input_vars 10000
php_value suhosin.get.max_vars 10000
php_value suhosin.post.max_vars 10000
php_value suhosin.request.max_vars 10000
- Htaccess dosyasını kaydedin. Bu kadar.

Mysql'de Tabloları İlişkilendirirken (Foreign Key) Cascade ve Restrict Farkı Nedir?


Biliyorsunuz Mysql'de tablolar arasında ilişki kurabiliyorsunuz. Bu ilişkilendirmeyi PhpMyAdmin benzeri bir arayüzden yada direk SQL kodu ile veritabanını oluştururken yapabilirsiniz. Mysql'de ilişkilendirmenin nasıl yapılacağı hakkında çok bilgi vardır. Burada buna değinmeyeceğim. Benim bahsetmek istediğim bu ilişkilendirmeyi yaparken Cascade yada Restrict hangisini seçmemiz gerektiğidir?

Cascade (kademeli): Eğer ilişkili ana satır (parent row) silinirse yada güncellenirse bağlı olduğu alt satır (child row) da silinir yada güncellenir.

Restrict (sınırlama): Fakat Restrict kullanırsanız o zaman ana satır (parent row) silinirse yada güncellenirse bağlı olduğu alt satır (child row) silinmez yada güncellenmez. Bir hata mesajı (error) verir. Örneğin "Silmeye çalıştığınız satırdaki .... alanı başka bir tabloda kullanılıyor". Bu hata işlemini parent row silerseniz çıkar. Bağlı olduğu child row'u silseniz bir hata almazsınız ki olması gereken de budur.

Set Null (Boş): Parent row silinirse yada güncellenirse child row'a Boş (Null) değeri atanır.

No Action (Hiçbirşey yapma): Hiç bir işlem yapmaz. Yani parent row silinse de güncellense de child row da bir işlem yapılmaz.

PHP ve Mysql Türkçe Karakter Sorunu

ADIM ADIM LATIN5 VE UTF-8 YÖNTEMLERİ
Select veya LIKE gibi komutları kullanarak MYSQL veritabanından bilgi çekerken, ÇĞİÖÜ çğıöü gibi harflerde hatalar çıkıyor. Bunun için en beğendiğim yöntemleri seçtim. Genelde 2 yöntem var. 1. yöntem LATIN5'i seçmek. 2. yöntem UTF-8'i seçmek. UTF-8 bütün dilleri kapsadığı için daha geçerli bi yöntem. Fakat ben ve forumlarda belirten bazı arkadaşlar bazen UTF-8'de her istediğimizi yapamadık. Bu nedenle uygulamanıza göre siz karar verebilirsiniz. İpucu olarak şunu söyleyebilirim. Eğer yapacağınız uygulama sadece TÜRKÇE olacak ve Facebook gibi başka dillere de hizmet vermeyecekse LATIN5'i seçebilirsiniz. Genel bi uygulamaysa UTF-8 daha uygundur.
Gelelim bu yöntemlere:
YÖNTEM 1 (LATİN5):
1- Mysql tablonuzun özelliklerinden karakter setini latin 5, karşılaştırmayı da latin5_turkish_ci olarak seçin. Sadece tabloyu ayarlamak yeterlidir. Ayrıca veritabanının yada tablo bileşenlerinin özelliklerini değiştirmeye gerek yoktur. Zaten bileşenler tablo değişince otomatik olarak latin5 olacaktır.
2-Php de sayfaların head kısımları arasına şu meta etiketini ekleyin:
meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-9">
3- Tablomuzu ve Sayfalarımızı latin5 olarak ayarladıktan sonra bir işlem kaldı. O da veritabanından veri çekerken de latin5 olarak çekmek. Bunun için şu kodu veri tabanı bağlantısından hemen sonraya ekleyin, yani şu şekilde:
?php
$baglan 
mysql_connect('localhost','user','pass',TRUE);
mysql_selectdb('db',
$baglan);
mysql_set_charset('latin5',
$baglan);
?>
Bu konuyu araştırdığınızda bu tek satırlık kodun bazı sitelerde 3 satır olarak verildiğini göreceksiniz fakat buna gerek yoktur, bu hali yeterli ve doğru kullanımdır (Bkz: php.net)
YÖNTEM 2 (UTF-8):
1- Mysql tablonuzun özelliklerinden karakter setini utf8, karşılaştırmayı da utf8_general_ci olarak seçin. Sadece tabloyu ayarlamak yeterlidir. Ayrıca veritabanının yada tablo bileşenlerinin özelliklerini değiştirmeye gerek yoktur. Zaten bileşenler tablo değişince otomatik olarak utf8 olacaktır.
2-Php de sayfaların head kısımları arasına şu meta etiketini ekleyin:
meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
3-Editörünüzde php dosyanızı kaydederken Kodlama kısmını utf-8 olarak seçin.
3- Tablomuzu ve Sayfalarımızı utf8 olarak ayarladıktan sonra bir işlem kaldı. O da veritabanından veri çekerken de utf8 olarak çekmek. Bunun için şu kodu veri tabanı bağlantısından hemen sonraya ekleyin, yani şu şekilde:
?php
$baglan 
mysql_connect('localhost','user','pass',TRUE);
mysql_selectdb('db',
$baglan);
mysql_set_charset('utf8',
$baglan);
?>
Bu konuyu araştırdığınızda bu tek satırlık kodun bazı sitelerde 3 satır olarak verildiğini göreceksiniz fakat buna gerek yoktur, bu hali yeterli ve doğru kullanımdır (Bkz: php.net)

TÜRKÇE KARAKTERLERİN HTML ve ASCII KARŞILIKLARI
HTML KARŞILIKLARI:
Ü <=> Ãœ
Ş <=> ÅŸ
Ğ <=> ÄŸ
Ç <=> Ç
İ <=> Ä°
Ö <=> Ö
ü <=> ü
ş <=> ÅŸ
ğ <=> ÄŸ
ç <=> ç
ı <=> ı
ö <=> ö
ASCII KARŞILIKLARI:
ç <=> & #231;
ı <=> & #305;
ğ <=> & #287;
ö <=> & #246;
ş <=> & #351;
ü <=> & #252;
Ç <=> & #199;
İ <=> & #304;
Ğ <=> & #208;
Ö <=> & #214;
Ş <=> & #350;
Ü <=> & #220;
ascii karakter tablosunun hepsi için tıklayın

Diyelimki herşeyi yaptınız ama yine de sayfalarınızda veritabanından çektiğiniz bilgiler bozuk çıkıyor. O zaman yukarıda verdiğim kodlar aracılığıyla PHP sayfalarınızda bazı replace fonksiyonlarını kullanarak bozuk çıkan karakterleri ekrana vermeden önce düzeltebilirsiniz. Kendi kullandığım örnek bi fonksiyon şöyle:
function karakter_tr($text)
{
$text = trim($text);
$search = array('Ð','Þ','Ý','Ä°');
$replace = array('Ğ','Ş','İ','İ');
$new_text = str_replace($search,$replace,$text);
return $new_text;
}
Bu fonksiyondaki $search ve $replace değişkenlerine aynı hizada olmak şartı ile istediğiniz karakteri ve html-ascii karşılığını ekleyebilirsiniz.

PHP ve Mysql Türkçe Karakter Sorunu

ADIM ADIM LATIN5 VE UTF-8 YÖNTEMLERİ
Select veya LIKE gibi komutları kullanarak MYSQL veritabanından bilgi çekerken, ÇĞİÖÜ çğıöü gibi harflerde hatalar çıkıyor. Bunun için en beğendiğim yöntemleri seçtim. Genelde 2 yöntem var. 1. yöntem LATIN5'i seçmek. 2. yöntem UTF-8'i seçmek. UTF-8 bütün dilleri kapsadığı için daha geçerli bi yöntem. Fakat ben ve forumlarda belirten bazı arkadaşlar bazen UTF-8'de her istediğimizi yapamadık. Bu nedenle uygulamanıza göre siz karar verebilirsiniz. İpucu olarak şunu söyleyebilirim. Eğer yapacağınız uygulama sadece TÜRKÇE olacak ve Facebook gibi başka dillere de hizmet vermeyecekse LATIN5'i seçebilirsiniz. Genel bi uygulamaysa UTF-8 daha uygundur.
Gelelim bu yöntemlere:
YÖNTEM 1 (LATİN5):
1- Mysql tablonuzun özelliklerinden karakter setini latin 5, karşılaştırmayı da latin5_turkish_ci olarak seçin. Sadece tabloyu ayarlamak yeterlidir. Ayrıca veritabanının yada tablo bileşenlerinin özelliklerini değiştirmeye gerek yoktur. Zaten bileşenler tablo değişince otomatik olarak latin5 olacaktır.
2-Php de sayfaların head kısımları arasına şu meta etiketini ekleyin:
meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-9">
3- Tablomuzu ve Sayfalarımızı latin5 olarak ayarladıktan sonra bir işlem kaldı. O da veritabanından veri çekerken de latin5 olarak çekmek. Bunun için şu kodu veri tabanı bağlantısından hemen sonraya ekleyin, yani şu şekilde:
?php
$baglan
= mysql_connect('localhost','user','pass',TRUE);

mysql_selectdb('db',
$baglan);

mysql_set_charset('latin5',
$baglan);
?>
Bu konuyu araştırdığınızda bu tek satırlık kodun bazı sitelerde 3 satır olarak verildiğini göreceksiniz fakat buna gerek yoktur, bu hali yeterli ve doğru kullanımdır (Bkz: php.net)
YÖNTEM 2 (UTF-8):
1- Mysql tablonuzun özelliklerinden karakter setini utf8, karşılaştırmayı da utf8_general_ci olarak seçin. Sadece tabloyu ayarlamak yeterlidir. Ayrıca veritabanının yada tablo bileşenlerinin özelliklerini değiştirmeye gerek yoktur. Zaten bileşenler tablo değişince otomatik olarak utf8 olacaktır.
2-Php de sayfaların head kısımları arasına şu meta etiketini ekleyin:
meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
3-Editörünüzde php dosyanızı kaydederken Kodlama kısmını utf-8 olarak seçin.
3- Tablomuzu ve Sayfalarımızı utf8 olarak ayarladıktan sonra bir işlem kaldı. O da veritabanından veri çekerken de utf8 olarak çekmek. Bunun için şu kodu veri tabanı bağlantısından hemen sonraya ekleyin, yani şu şekilde:
?php
$baglan
= mysql_connect('localhost','user','pass',TRUE);

mysql_selectdb('db',
$baglan);

mysql_set_charset('utf8',
$baglan);
?>
Bu konuyu araştırdığınızda bu tek satırlık kodun bazı sitelerde 3 satır olarak verildiğini göreceksiniz fakat buna gerek yoktur, bu hali yeterli ve doğru kullanımdır (Bkz: php.net)

TÜRKÇE KARAKTERLERİN HTML ve ASCII KARŞILIKLARI
HTML KARŞILIKLARI:
Ü <=> Ãœ
Ş <=> ÅŸ
Ğ <=> ÄŸ
Ç <=> Ç
İ <=> Ä°
Ö <=> Ö
ü <=> ü
ş <=> ÅŸ
ğ <=> ÄŸ
ç <=> ç
ı <=> ı
ö <=> ö
ASCII KARŞILIKLARI:
ç <=> & #231;
ı <=> & #305;
ğ <=> & #287;
ö <=> & #246;
ş <=> & #351;
ü <=> & #252;
Ç <=> & #199;
İ <=> & #304;
Ğ <=> & #208;
Ö <=> & #214;
Ş <=> & #350;
Ü <=> & #220;
ascii karakter tablosunun hepsi için tıklayın

Diyelimki herşeyi yaptınız ama yine de sayfalarınızda veritabanından çektiğiniz bilgiler bozuk çıkıyo. O zaman yukarıda verdiğim kodlar aracılığıyla PHP sayfalarınızda bazı replace fonksiyonlarını kullanarak bozuk çıkan karakterleri ekrana vermeden önce düzeltebilirsiniz. Kendi kullandığım örnek bi fonksiyon şöyle:
function karakter_tr($text)
{
$text = trim($text);
$search = array('Ð','Þ','Ý','Ä°');
$replace = array('Ğ','Ş','İ','İ');
$new_text = str_replace($search,$replace,$text);
return $new_text;
}
Bu fonksiyondaki $search ve $replace değişkenlerine aynı hizada olmak şartı ile istediğiniz karakteri ve html-ascii karşılığını ekleyebilirsiniz.

EasyPHP 5.3.x ile Mysql ve PhpMyAdmin Bağlantı Hatası

EasyPHP 5.3.2, EasyPHP 5.3.1 yada EasyPHP'nin son versiyonlarında eskiden çalışan mysql bağlantılarınızda (mysql_connect) şöyle bir hata alıyorsanız:

Warning: mysql_connect() [function.mysql-connect]: [2002] Bağlanılan uygun olarak belli bir süre içinde yanıt vermediğinde (trying to connect via tcp://localhost:3306) in C:\Program Files\EasyPHP\www\baglan.php on line 17

Warning: mysql_connect() [function.mysql-connect]: Bağlanılan uygun olarak belli bir süre içinde yanıt vermediğinden veya kurulan bağlantı bağlanılan ana bilgisayar yanıt vermediğinden bir bağlantı kurulamadı. in C:\Program Files\EasyPHP\www\
baglan.php on line 17

Fatal error: Maximum execution time of 30 seconds exceeded in C:\Program Files\EasyPHP\www\
baglan.php on line 17
çözümü burada:
$link = mysql_connect("localhost","root","");


şeklindeki bağlantı satırınızı

$link = mysql_connect("127.0.0.1","root","");

şeklinde değiştirin.

Not: Eğer phpmyadmin'de çalışmıyor ve beyaz sayfa görünüyorsa aynı işlemi phpmyadmin ayarlarından yapmalısınız. phpmyadmin/config.inc dosyasındaki 18. satırdaki localhost yerine 127.0.0.1 yazmalısınız.