Laravel Türkiye Discord Kanalı Forumda kod paylaşılırken dikkat edilmesi gerekenler!Birlikte proje geliştirmek ister misiniz?
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);
	}
bir ay sonra
$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.
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);
 }