конвертировать mysql в pdo

Поэтому у меня есть функция, которая должна обрабатывать все операции выполнения данных: 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 (), чтобы сделать его многоразовым. Любые предложения / рекомендации приветствуются.

Solutions Collecting From Web of "конвертировать mysql в pdo"

Поскольку ваша существующая функция принимает полностью сформированную строку 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... 

Есть более умные вещи, которые вы можете сделать с параметризованными запросами – например, привязка переменных к выходным параметрам, подготовка запроса один раз и выполнение его несколько раз с разными параметрами, но для этого потребуется больше изменений в способе работы вашего кода вызова.