2013-09-23 14 views
26

W jaki sposób uzyskuje się informacje o wychodzących parametrach przekazanych do surowego zapytania w Laravel 4? Spodziewałem się czegoś takiego DB::escape() (który dzwoni dzwonek z laravel 3), a także próbę DB::quote() (co myślałem, może być dostępna za pośrednictwem PDO object)Escape surowe kwerendy SQL w Laravel 4

$query = DB::select("SELECT * FROM users WHERE users.id = " . DB::escape($userId)); 

Nie możemy użyć metody Select zastępcze jak wyżej jest tylko uproszczonym przykładem tego, co próbujemy osiągnąć. Mamy duże niestandardowe zapytanie z kilkoma zagnieżdżonymi zapytaniami, które nie mogą zostać dostosowane do kreatora zapytań.

Jakie jest najlepsze podejście do ucieczki przed wstawieniem do Laravel 4?

EDIT:

Właśnie odkryłem, że można uzyskać dostęp do obiektu PDO i użyć funkcji ofertowe na to w ten sposób. Czy to nadal jest najlepsze podejście, czy też istnieje łatwiejszy sposób dostępu do tej funkcji?

DB::connection()->getPdo()->quote("string to quote"); 
+0

Dzięki. +1 za uwzględnienie rozwiązania (mógłbyś również zamieścić go oddzielnie jako odpowiedź i zaakceptował to ... może zaoszczędzić trochę czasu dla nas) –

+1

@ J.Bruni, dobra uwaga! Dodałem go również jako odpowiedź rzeczywistą, więc powinno być łatwiej znaleźć. – Dwight

Odpowiedz

48

Można zacytować swoje struny w ten sposób, poprzez elewacji DB.

DB::connection()->getPdo()->quote("string to quote"); 

I włożył tę odpowiedź na moje pytanie, kiedy odkrył, jednak mam teraz umieścić go w postaci rzeczywistej odpowiedzi, aby ułatwić innym osobom odnaleźć.

+3

Dzięki! To niesamowite, jak ludzie są nieugięci w odpowiadaniu na niewłaściwe pytania. Potrzebuję tej samej odpowiedzi co ty, a parametry też nie działają w mojej sytuacji. –

+0

Działa, ale taka długa rzecz do zadzwonienia! DB :: escape() byłoby miłe. – Andrew

17
$value = Input::get("userID"); 

$results = DB::select(DB::raw("SELECT * FROM users WHERE users.id = :value"), array(
    'value' => $value, 
)); 

Szczegóły HERE

+3

To nie odpowiada na pytanie, stwierdziło, że nie szukam rozwiązania z obiektami zastępczymi, ale raczej odpowiedni sposób na uniknięcie jednej zmiennej. – Dwight

+1

@Dwight: As moot. Podczas ucieczki, aby zakodować wartość zmiennej jako SQL, podobnie jest z elementem zastępczym. Podobnie jak PDO. – hakre

+1

uwaga, miałem problemy z używaniem tego w połączeniu z większą ilością instrukcji 'where'. Kreator zapytań nie łączy symboli zastępczych w 'select()' i innych dynamicznych zamiennikach, jak w 'where'. – tomvo

8

Można również spróbować, (Read Documentation)

$results = DB::select('SELECT * FROM users WHERE users.id = ?', array($userId)); 
+2

+1 do tej odpowiedzi. Korzystanie z powiązań tablic, jak na powyższym przykładzie, będzie Cię chronić. Więcej informacji tutaj http://forums.laravel.io/viewtopic.php?id=11068 – Laurence

+1

To nie odpowiada na pytanie, stwierdziło, że nie szukam rozwiązania z obiektami zastępczymi, ale raczej odpowiedni sposób na uniknięcie jednej zmiennej. – Dwight

+1

@Dwight, to jest to, co "wiążą tablicę/powiązane parametry", bezpieczne, uciekły, nie można zastosować zastrzyków sql, a nie tylko miejsce właścicieli. Po prostu przeczytaj [tę odpowiedź] (http://stackoverflow.com/questions/3716373/real-escape-string-and-pdo), aby oczyścić się. –

2

używam w moim helpers.php na laravel 5:

if (! function_exists('esc_sql')) 
{ 
    function esc_sql($string) 
    { 
     return app('db')->getPdo()->quote($string); 
    } 
} 

Wtedy mogę używać esc_sql funkcję gdzie muszę pergorm ucieczce do surowych zapytań SQL.

1

Znalazłem to pytanie, szukając typowego sql escaping w Laravel. Tym, czego potrzebowałem, była jednak ucieczka z nazwy tabeli/kolumny. Więc na przyszłość:

/** 
* Quotes database identifier, e.g. table name or column name. 
* For instance: 
* tablename -> `tablename` 
* @param string $field 
* @return string  
*/ 
function db_quote_identifier($field) { 
    static $grammar = false; 
    if (!$grammar) { 
    $grammar = DB::table('x')->getGrammar(); // The table name doesn't matter. 
    } 
    return $grammar->wrap($field); 
} 
0

Oto pełniejszy przykład pokazujący, jak uciec obie wartości i kolumn i rozciągają laravel za QueryBuilder:

<?php 

namespace App\Providers; 

use Illuminate\Database\Query\Builder; 
use Illuminate\Support\ServiceProvider; 


class DatabaseQueryBuilderMacroProvider extends ServiceProvider { 

    public function register() { 
     Builder::macro('whereInSet', function($columnName, $value) { 
      /** @var \Illuminate\Database\Query\Grammars\Grammar $grammar */ 
      $grammar = $this->getGrammar(); 
      return $this->whereRaw('FIND_IN_SET(?,' . $grammar->wrap($columnName) . ')', [$value]); 
     }); 
    } 
}