Поэтому у меня есть функция, которая должна обрабатывать все операции выполнения данных: sql
function loadResult($sql) { $this->connect(); $sth = mysql_query($sql); $rows = array(); while($r = mysql_fetch_object($sth)) {$rows[] = $r;} $this->disconnect(); return $rows; }
Я хочу преобразовать его в pdo, и это то, что у меня есть до сих пор: pdo
function loadResult($sql) { $this->connect(); $sth = $this->con->prepare($sql); //execute bind values here $sth->execute(); $rows = array(); while ( $r = $sth->fetch(PDO::FETCH_OBJ) ) {$rows[] = $r;} $this->disconnect(); return $rows; }
Вот пример функции о том, как я использую ее для просмотра данных из базы данных:
function viewtodolist() { $db=$this->getDbo(); //connect to database $sql="SELECT * FROM mcms_todolist_tasks"; //maybe the bind values are pushed into an array and sent to the function below together with the sql statement $rows=$db->loadResult($sql); foreach($rows as $row){echo $row->title; //echo some data here } }
Я только что вытащил важные фрагменты, поэтому некоторые переменные и методы относятся к другим php-классам. Так или иначе, запрос mysql работает нормально, но запрос PDO дает мне головные боли в отношении того, как включать в себя атрибуты bindValue, скорее всего, в функции viewtodolist (), чтобы сделать его многоразовым. Любые предложения / рекомендации приветствуются.
Поскольку ваша существующая функция принимает полностью сформированную строку SQL, без заполнителей, вам не нужно использовать prepare
+ bind
. Ваш код в письменном виде должен работать нормально, или вы можете использовать PDO::query()
для выполнения SQL за один шаг.
Если вы хотите использовать параметризованные запросы, ваша функция loadResult
должна будет немного изменить, как и вы пишете ваш SQL. В примере SQL, который вы даете, на самом деле нет ничего, что могло бы быть превращено в параметр ( имена столбцов и имена таблиц не могут быть параметрами, как описано здесь ), но я буду использовать мнимую вариацию:
// Get the todo tasks for a particular user; the actual user ID is a parameter of the SQL $sql = "SELECT * FROM mcms_todolist_tasks WHERE user_id = :current_user_id"; // Execute that SQL, with the :current_user_id parameter pulled from user input $rows = $db->loadResult($sql, array(':current_user_id' => $_GET['user']));
Это хороший безопасный способ ввода пользователя в запрос, поскольку MySQL знает, какие части являются параметрами и которые являются частью самого SQL, а часть SQL не имеет переменных, с которыми любой может вмешиваться.
Самый простой способ сделать эту работу с вашей существующей функцией loadResult
будет примерно такой:
// Function now takes an optional second argument // if not passed, it will default to an empty array, so existing code won't cause errors function loadResult($sql, $params=array()) { $this->connect(); $sth = $this->con->prepare($sql); // pass the parameters straight to the execute call $sth->execute($params); // rest of function remains the same...
Есть более умные вещи, которые вы можете сделать с параметризованными запросами – например, привязка переменных к выходным параметрам, подготовка запроса один раз и выполнение его несколько раз с разными параметрами, но для этого потребуется больше изменений в способе работы вашего кода вызова.