İlginizi Çekebilir
  1. Ana Sayfa
  2. PHP

Süper hızlı PHP MySQL Veritabanı Sınıfı

Süper hızlı PHP MySQL Veritabanı Sınıfı
Süper hızlı PHP MySQL Veritabanı Sınıfı
+ - 0

Merhabalar, bu yazımda Süper hızlı PHP MySQL Veritabanı Sınıfı hakkında konuşacağız. PHP ile bir veri tabanına bağlantı yapabilmek için kullanabileceğimiz bir sınıftır. Ancak bilinmelidir ki hızlı bağlantılar kurabilmek sadece kodlar ile ilgili değildir. Aynı zamanda veritabanı üzerinde de işlemler gerektirir.

 

Süper Hızlı PHP MySQL Veritabanı Sınıfı

Bu hafif veritabanı sınıfı PHP ile yazılmıştır ve MySQLi uzantısını kullanır, SQL enjeksiyon saldırıları konusunda endişelenmenize gerek kalmadan sorgularınızı düzgün bir şekilde güvenceye almak için hazırlanmış ifadeleri kullanır.

MySQLi uzantısı, birlikte çalışabileceğiniz yerleşik hazırlanmış ifadelere sahiptir, bu SQL enjeksiyonunu önleyecek ve veritabanınızın açığa çıkmasını önleyecektir, bazı geliştiricilerin bu yöntemleri doğru şekilde nasıl kullanacakları konusunda kafaları karıştığından, bu kullanımı kolay veritabanı sınıfını oluşturdum bu sizin için işi yapacak.

Bu veritabanı sınıfı yeni başlayanlar için uygundur ve uygulaması kolaydır, yerel MySQLi yöntemleriyle bir veritabanından veri almak için 3-7 satır kod yazmanız gerekir, bu sınıfla bunu sadece 1-2 satır kodla yapabilirsiniz, ve anlaşılması çok daha kolaydır.

Kaynak

Yeni bir dosya oluşturun ve onu db.php olarak adlandırın ve şunu ekleyin:

<?php
class db {

    protected $connection;
	protected $query;
    protected $show_errors = TRUE;
    protected $query_closed = TRUE;
	public $query_count = 0;

	public function __construct($dbhost = 'localhost', $dbuser = 'root', $dbpass = '', $dbname = '', $charset = 'utf8') {
		$this->connection = new mysqli($dbhost, $dbuser, $dbpass, $dbname);
		if ($this->connection->connect_error) {
			$this->error('Failed to connect to MySQL - ' . $this->connection->connect_error);
		}
		$this->connection->set_charset($charset);
	}

    public function query($query) {
        if (!$this->query_closed) {
            $this->query->close();
        }
		if ($this->query = $this->connection->prepare($query)) {
            if (func_num_args() > 1) {
                $x = func_get_args();
                $args = array_slice($x, 1);
				$types = '';
                $args_ref = array();
                foreach ($args as $k => &$arg) {
					if (is_array($args[$k])) {
						foreach ($args[$k] as $j => &$a) {
							$types .= $this->_gettype($args[$k][$j]);
							$args_ref[] = &$a;
						}
					} else {
	                	$types .= $this->_gettype($args[$k]);
	                    $args_ref[] = &$arg;
					}
                }
				array_unshift($args_ref, $types);
                call_user_func_array(array($this->query, 'bind_param'), $args_ref);
            }
            $this->query->execute();
           	if ($this->query->errno) {
				$this->error('Unable to process MySQL query (check your params) - ' . $this->query->error);
           	}
            $this->query_closed = FALSE;
			$this->query_count++;
        } else {
            $this->error('Unable to prepare MySQL statement (check your syntax) - ' . $this->connection->error);
        }
		return $this;
    }


	public function fetchAll($callback = null) {
	    $params = array();
        $row = array();
	    $meta = $this->query->result_metadata();
	    while ($field = $meta->fetch_field()) {
	        $params[] = &$row[$field->name];
	    }
	    call_user_func_array(array($this->query, 'bind_result'), $params);
        $result = array();
        while ($this->query->fetch()) {
            $r = array();
            foreach ($row as $key => $val) {
                $r[$key] = $val;
            }
            if ($callback != null && is_callable($callback)) {
                $value = call_user_func($callback, $r);
                if ($value == 'break') break;
            } else {
                $result[] = $r;
            }
        }
        $this->query->close();
        $this->query_closed = TRUE;
		return $result;
	}

	public function fetchArray() {
	    $params = array();
        $row = array();
	    $meta = $this->query->result_metadata();
	    while ($field = $meta->fetch_field()) {
	        $params[] = &$row[$field->name];
	    }
	    call_user_func_array(array($this->query, 'bind_result'), $params);
        $result = array();
		while ($this->query->fetch()) {
			foreach ($row as $key => $val) {
				$result[$key] = $val;
			}
		}
        $this->query->close();
        $this->query_closed = TRUE;
		return $result;
	}

	public function close() {
		return $this->connection->close();
	}

    public function numRows() {
		$this->query->store_result();
		return $this->query->num_rows;
	}

	public function affectedRows() {
		return $this->query->affected_rows;
	}

    public function lastInsertID() {
    	return $this->connection->insert_id;
    }

    public function error($error) {
        if ($this->show_errors) {
            exit($error);
        }
    }

	private function _gettype($var) {
	    if (is_string($var)) return 's';
	    if (is_float($var)) return 'd';
	    if (is_int($var)) return 'i';
	    return 'b';
	}

}
?>

Nasıl kullanılır?

MySQL veritabanına bağlanın:

include 'db.php';

$dbhost = 'localhost';
$dbuser = 'root';
$dbpass = '';
$dbname = 'example';

$db = new db($dbhost, $dbuser, $dbpass, $dbname);

 

Veritabanından bir kayıt alın:

$account = $db->query('SELECT * FROM accounts WHERE username = ? AND password = ?', 'test', 'test')->fetchArray();
echo $account['name'];

Veya şunları yapabilirsiniz:

$account = $db->query('SELECT * FROM accounts WHERE username = ? AND password = ?', array('test', 'test'))->fetchArray();
echo $account['name'];

 

Bir veritabanından birden çok kayıt alın:

$accounts = $db->query('SELECT * FROM accounts')->fetchAll();

foreach ($accounts as $account) {
	echo $account['name'] . '<br>';
}

Sonuçların bir dizide saklanmasını istemiyorsanız bir geri arama belirtebilirsiniz (büyük miktarda veri için kullanışlıdır):

$db->query('SELECT * FROM accounts')->fetchAll(function($account) {
    echo $account['name'];
});

Döngüyü kırmanız gerekirse şunları ekleyebilirsiniz:

return 'break';

 

Satır sayısını alın:

$accounts = $db->query('SELECT * FROM accounts');
echo $accounts->numRows();

Etkilenen satır sayısını alın:

$insert = $db->query('INSERT INTO accounts (username,password,email,name) VALUES (?,?,?,?)', 'test', 'test', 'test@gmail.com', 'Test');
echo $insert->affectedRows();

Toplam sorgu sayısını alın:

echo $db->query_count;

Son ekleme kimliğini alın:

echo $db->lastInsertID();

Veritabanını kapatın:

$db->close();

 

Çözüm

Veritabanı sınıfı MySQLi uzantısını kullanır, bu PHP sürümünde yerleşiktir >= 5.0.0. PHP sürüm 5.0.0 ila 5.3.0 kullanıyorsanız, yüklemeniz gerekir: mysqlnd .

Bu sınıfı kullanarak ifadeler hazırlamanıza gerek yok, bunu sizin için otomatik olarak yapacak (daha az yaz, daha fazlasını yap), sorgularınız güvende olacak, sadece şunu kullanarak çıktınızdan kaçtığınızdan emin olun.htmlözel karakterlerveya tercih ettiğiniz kaçış yöntemi.

Bu veritabanı sınıfını projelerinizde kullanmakta özgürsünüz.

MIT Lisansı altında yayınlandı.

 

NOT: Bu yazı bir çeviri yazısıdır. Orjinal yazıya gitmek için tıklayabilirsiniz.

 


Süper hızlı PHP MySQL Veritabanı Sınıfı yazımızda bu kadardı arkadaşlar.  Umarım faydalı olmuştur. Diğer yazılarda görüşmek üzere…

PHP Dersleri için başlattığım repoya bağlantıya tıklayarak ulaşabilirsiniz. Tüm PHP yazılarım için tıklayabilirsiniz.

Discord sunucuma katılmayı unutmayın. :D

Kodla kalın. :)

Bu yazıya tepkiniz ne oldu?

Yazar Hakkında

Lise Ağ Sistemleri ve Yönetimi bölümü, üniversite Bilgisayar Programcılığı bölümü Ön Lisans, Yönetim Bilişim Sistemleri Lisans öğrenimi aldım. Askerlik görevimi tamamladım. Uzmanlık alanım; C# ve SQL Programlama dilleri ile müşteri odaklı, kullanıcı dostu ERP ve CRM gibi sistemleri geliştirmektir. Ayrıca şuanda PHP ve MYSQL alanında projeler geliştirmekteyim. C++, Phyton, Xamarin, MVC gibi konuları öğrenmek ve kendimi geliştirme çabası içerisindeyim. Discord için: https://discord.gg/FBxZeHu9

Değerli yorumlarınızı bekliyorum. :)