Giriş yapmadınız.

Duyuru

TÜRKÇE KİTAP DUYURUSU:
Laravel 5 : Laravel 5.1 Güzelliği (Türkçe)
Vue.js 2 : Vue.js 2 Majesteleri (Türkçe)

#1 15.03.2013 11:29:41

naczu
Üye
Kayıtlı: 10.03.2013
Mesajlar: 20

Advanced Pagination

Merhaba Arkadaşlar. Laravel 3 te pagination için bazı eksiklikler laravel 4 te kapatılıyor. Fakat laravel 3 kullanıyorsanız, sizle basit ama güzel bir pagination örneği paylaşmak isterim. Unutmayın ki bilgi paylaşıldıkça büyür. Lütfen paylaşım konusunda bencil olmayın.

Aşağıdaki kodlar inputtan gelen bir yada birden fazla kelimenin veritabanında aranıp sonuçların listelenmesi ile alakalı. İstediğiniz gibi uyarlayıp modifiye edebilirsiniz. PDO driver kullanıldığı için whitespace ve comma dışındaki regexp kodlarını çıkarabilirsiniz. Bilgi amaçlı verilmiştir. Saygılar.

class Search_Controller extends Base_Controller
{
	public function action_index()
	{
		if(count(Input::get('page')) && Input::get('page') > 1){
			$limit = (Input::get('page')-1)*10;
		}
		else{
			$limit=0;
		}
		$terms = Input::get('search');
		function search_split_terms($terms){

			$terms = preg_replace("/\"(.*?)\"/e", "search_transform_term('\$1')", $terms);
			$terms = preg_split("/\s+|,/", $terms);

			$out = array();

			foreach($terms as $term){

				$term = preg_replace("/\{WHITESPACE-([0-9]+)\}/e", "chr(\$1)", $term);
				$term = preg_replace("/\{COMMA\}/", ",", $term);

				$out[] = $term;
			}

			return $out;
		}

		function search_transform_term($term){
			$term = preg_replace("/(\s)/e", "'{WHITESPACE-'.ord('\$1').'}'", $term);
			$term = preg_replace("/,/", "{COMMA}", $term);
			return $term;
		}
		$terms = search_split_terms($terms);
		$parts = array();
		foreach($terms as $key){
			$parts[] = "field_name LIKE '%$key%' ";
		}
		$parts = implode(' AND ', $parts);
		$sql = "SELECT SQL_CALC_FOUND_ROWS id, fiel_name1, field_name2 FROM table_name WHERE $parts LIMIT $limit, 10";
		$result = DB::query($sql);
		$per_page=sizeof($result);
		$total=DB::only('SELECT FOUND_ROWS()');
		$results = Paginator::make($result,$total,10);
		foreach ($results->results as $key) {
			$data[]['info']=array($key->id,$key->field_name1,$key->field_name2);
		}
		$data['links']=$results->links();
		return Response::json($data);
	}

Son düzenleyen naczu (15.03.2013 11:30:43)

Çevrimdışı

#2 10.04.2013 02:39:39

Aristona
Üye
Yer: Kastamonu
Kayıtlı: 08.02.2013
Mesajlar: 173
Website

Yanıt: Advanced Pagination

$limit = (Input::get('page')-1)*10;
$sql = "SELECT SQL_CALC_FOUND_ROWS id, fiel_name1, field_name2 FROM table_name WHERE $parts LIMIT $limit, 10";
$result = DB::query($sql);

Ding ding. Tehlike çanları çalıyor.

LIMIT $limit ?, array($limit);

Laravel bunu kendini sanitize ediyormu bilmiyorum ancak;
a. Asla değişkenleri direkt olarak query içinde kullanmayın. Son derece bad practise bir kullanım,
b. Eğer Laravel bunu kendisi sanitize etmiyorsa yandınız.


"Eğer 6 ay önce yazdığın kodları gördüğünde utanmıyorsan, kendini yeterince hızlı geliştiremiyorsun demektir."

Site: http://anilunal.com/
Blog: http://aristona.github.io/

Çevrimdışı

#3 10.04.2013 12:37:18

naczu
Üye
Kayıtlı: 10.03.2013
Mesajlar: 20

Yanıt: Advanced Pagination

aynen öyle bad practice ... ama bu tür query lerde sql injectionlara kendinde önlem alabilirsin PDO ya gerek kalmadan ...Ayrıca ben DB::query()' nin de sql injection a karşı korumalı olduğunu düşünüyordum yanılmışım. Zaten laravel 4 te DB::query() diye bişey kalmamış kaldırılmış. DB::raw var onun içinde injection uyarısı yapıyor zaten

Şöyle olması daha iyi olurdu;

$db_query = $this->DB;
                foreach($fields as $key)
               {
		      foreach(array_filter(array_unique(explode(',', preg_replace('/[\s\W]+/', ',', $request)))) as $val) $db_query->where($key, 'like', "%{$val}%");
		     $query_result = $db_query->paginate(10);
               }

Son düzenleyen naczu (10.04.2013 12:48:09)

Çevrimdışı

Forum alt kısmı