PHP PDO przygotowane oświadczeń i procedur przechowywanych
Podręcznik PHP PDO referencyjny
Wiele bardziej dojrzałych baz wsparcie koncepcji przygotowanych sprawozdań.
Czym jest przygotowane sprawozdanie? Potraktujcie to jako skompilowany szablon, który chcesz uruchomić SQL, który można dostosować za pomocą zmiennych parametrów. Przygotowane sprawozdania oferują dwie główne korzyści:
- tylko zapytania postanawia obróbki wstępnej (lub) jeden raz, ale może być wykonywana wielokrotnie, w tych samych lub różnych parametrów. Gdy kwerenda jest gotowa, baza danych będzie analizował, skompilować i wykonać plan optymalizacji zapytań. W przypadku złożonych zapytań, ten proces trwa długo, jeśli trzeba powtarzać wiele razy z różnymi parametrami tego samego zapytania, to proces będzie znacznie zmniejszyć szybkość działania aplikacji. Korzystając z przygotowanego sprawozdania uniknąć powtarzania analizy / opracowania / cykl zoptymalizować. W skrócie, przygotowuje sprawozdanie wykorzystywać mniej zasobów, a tym samym szybciej.
- Zapewnienie parametrów do sporządzanych sprawozdań nie trzeba używać cudzysłowu, kierowcy będą obsługiwane automatycznie. Jeśli aplikacja używa tylko przygotowane oświadczenia, możemy zapewnić, że żaden SQL injection. (Jednakże, jeśli inne części zapytania nie uciekł od wejścia na budowę, to wciąż istnieje ryzyko SQL injection).
Przygotowane sprawozdania tak użyteczne, że jedynym elementem jest przetwarzanie analogowo gdy kierowca nie obsługuje PDO. Gwarantuje to, że niezależnie od tego, czy baza danych ma funkcję, można zapewnić, że aplikacje mogą korzystać z tych samych wzorców dostępu do danych.
PreparedStatements powtarzane wstawiania
Poniższy przykład podstawiając odpowiednią nazwę zastępczy o nazwie i wartości, aby wykonać operację INSERT
<?php $stmt = $dbh->prepare("INSERT INTO REGISTRY (name, value) VALUES (:name, :value)"); $stmt->bindParam(':name', $name); $stmt->bindParam(':value', $value); // 插入一行 $name = 'one'; $value = 1; $stmt->execute(); // 用不同的值插入另一行 $name = 'two'; $value = 2; $stmt->execute(); ?>
PreparedStatements powtarzane wstawiania
Poniższy przykład zastępując nazwę i wartość? Placeholders wykonać kwerendy wstawiania.
<?php $stmt = $dbh->prepare("INSERT INTO REGISTRY (name, value) VALUES (?, ?)"); $stmt->bindParam(1, $name); $stmt->bindParam(2, $value); // 插入一行 $name = 'one'; $value = 1; $stmt->execute(); // 用不同的值插入另一行 $name = 'two'; $value = 2; $stmt->execute(); ?>
Uzyskaj dane za pomocą przygotowanych sprawozdań
Poniższy przykład w postaci klucza dostępu opartego na danych już przewidziane. Wprowadzane przez użytkownika jest automatycznie ujęta w cudzysłów, więc nie ma ryzyka ataków SQL injection.
<?php $stmt = $dbh->prepare("SELECT * FROM REGISTRY where name = ?"); if ($stmt->execute(array($_GET['name']))) { while ($row = $stmt->fetch()) { print_r($row); } } ?>
Jeśli wsparcie sterownika bazy danych, aplikacja może również wiązać parametry wejściowe i wyjściowe parametry wyjściowe są zazwyczaj stosowane w celu uzyskania wartości z procedury przechowywanej. Parametry wyjściowe w obsłudze niż parametrów wejściowych być nieco bardziej skomplikowana, ponieważ podczas wiązania parametru wyjściowego, należy znać parametry danej długości. Jeśli wartość parametru jest większa niż obowiązującymi zaleceniami długości, zostanie wygenerowany błąd.
Wywołanie procedury przechowywanej z parametrem wyjściowym
<?php $stmt = $dbh->prepare("CALL sp_returns_string(?)"); $stmt->bindParam(1, $return_value, PDO::PARAM_STR, 4000); // 调用存储过程 $stmt->execute(); print "procedure returned $return_value\n"; ?>
Można również określić obie wartości wejściowych i wyjściowych parametrów, składnia jest podobna do parametrów wyjściowych. W następnym przykładzie, ciąg "hello" jest przekazywany do procedury składowanej, gdy procedura składowana zwraca, cześć jest zastępowany wartości zwracanej procedury przechowywanej.
Z wejścia / parametrów wyjściowych do wywołania procedury przechowywanej
<?php $stmt = $dbh->prepare("CALL sp_takes_string_returns_string(?)"); $value = 'hello'; $stmt->bindParam(1, $value, PDO::PARAM_STR|PDO::PARAM_INPUT_OUTPUT, 4000); // 调用存储过程 $stmt->execute(); print "procedure returned $value\n"; ?>
Nieprawidłowe użycie zastępczego
<?php $stmt = $dbh->prepare("SELECT * FROM REGISTRY where name LIKE '%?%'"); $stmt->execute(array($_GET['name'])); // 占位符必须被用在整个值的位置 $stmt = $dbh->prepare("SELECT * FROM REGISTRY where name LIKE ?"); $stmt->execute(array("%$_GET[name]%")); ?>