Функция / процедура PHP для динамического связывания вопросительных знаков

Я довольно новичок в PHP. Мне нужно связать параметры в PDO, написав пользовательскую функцию.

Скажите, что это 2 sqls, которые у меня есть.

sample_sql_1="select f_name, age, address from table1 where l_name=? and dob >= ? and cty =?" sample_sql_2="select * from table2 where cty=?" 

Я хотел бы написать функцию, которая принимает запрос sql, и привязать параметры, которые будут привязаны к вопросительным знакам, независимо от того, сколько параметров я передаю.

Пример: я хочу позвонить,

 bind_params(sample_sql_1,array($name,$dob,$cty)); bind_params(sample_sql_2,array($cty)); 

Вот функция, которую я написал до сих пор, чтобы просто подключиться к БД

 function pdo_db_query($query) { try { # MySQL with PDO_MYSQL $DBH = new dbconn(); // Create DB connection $DBH->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); $DBH->setAttribute( PDO::ATTR_EMULATE_PREPARES, false ); $STH = $DBH->prepare($query); // Please help to create a dynamic function to bind bind_params(sample_sql_1,array($name,$dob,$cty)); bind_params(sample_sql_2,array($cty)); / Execute the query $STH->execute(); # setting the fetch mode $STH->setFetchMode(PDO::FETCH_ASSOC); // Create temporary array variable $json_arr = array(); while ($row = $STH->fetch()) { $json_arr[] = $row; } # Close the connection $DBH = null; // Return the result set as a json echo json_encode($json_arr); } catch (PDOException $e) { echo $e->getMessage(); var_dump($e->getMessage()); } } 

Мне нужна помощь в написании функции «bind_params». Любая помощь принесет мне большую пользу, пожалуйста.

Вам необязательно требуется bind_params() , вы можете просто предоставить значения в качестве массива для execute() .

См. Этот пример из документации :

 /* Execute a prepared statement by passing an array of insert values */ $calories = 150; $colour = 'red'; $sth = $dbh->prepare('SELECT name, colour, calories FROM fruit WHERE calories < ? AND colour = ?'); $sth->execute(array($calories, $colour)); 

В частности, для вашего случая:

 // add a parameter for the values function pdo_db_query($query, $params = array()) { try { # MySQL with PDO_MYSQL $DBH = new dbconn(); // Create DB connection $DBH->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); $DBH->setAttribute( PDO::ATTR_EMULATE_PREPARES, false ); $STH = $DBH->prepare($query); // Execute the query with the given params $STH->execute($params); # setting the fetch mode $STH->setFetchMode(PDO::FETCH_ASSOC); // Create temporary array variable $json_arr = array(); while ($row = $STH->fetch()) { $json_arr[] = $row; } # Close the connection $DBH = null; // Return the result set as a json echo json_encode($json_arr); } catch (PDOException $e) { echo $e->getMessage(); var_dump($e->getMessage()); } } 

Чтобы использовать это с запросом LIKE:

 $query = "SELECT * FROM table WHERE field LIKE ?"; $params = array( '%' . $searchvalue . '%' ); $result = pdo_db_query( $query, $params ); 

Следующий код использует привязку «Lazy» для передачи данных через массив. Это позволяет? которые должны быть вставлены, и вставки AND в зависимости от количества столбцов, переданных в $ columnArray. Я прокомментировал некоторые из ваших конкретных кода базы данных, чтобы вы могли видеть, как формируется запрос. Вам нужно передать массив имен столбцов вместе с первой частью инструкции sql перед предложением WHERE .

Я добавил образцы данных для тестирования и код, чтобы показать запрос, сформированный вместе с параметрами для execute (). Они должны быть удалены, а код с комментариями восстановлен для тестирования с базой данных.

Пример результата

 select f_name, age, address from table1 WHERE name = ? AND dob = ? AND cty = ? 

Массив ([0] => Том [1] => 2014-11-11 [2] => Лондон)

  function pdo_db_query($query,$columnArray) { /* try { # MySQL with PDO_MYSQL $DBH = new dbconn(); // Create DB connection $DBH->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); $DBH->setAttribute( PDO::ATTR_EMULATE_PREPARES, false ); // Please help to create a dynamic function to bind bind_params(sample_sql_1,array($name,$dob,$cty)); bind_params(sample_sql_2,array($cty)); */ // Set the first clause to WHERE $clause = " WHERE "; foreach ($columnArray as $column) { //Add column name and ? placeholder $query .= "$clause $column = ?"; //Change WHERE to And for remaining conditions $clause = " AND "; } //This echo is to show query echo $query."<BR>"; // Execute query using Lazy Binding passing data into execute via array /*$STH->execute($paramArray); /* // Create temporary array variable $json_arr = array(); while ($row = $STH->fetch()) { $json_arr[] = $row; } # Close the connection $DBH = null; */ } // Parameters for testing $name ="Tom"; $dob ="2014-11-11"; $cty ="London"; $paramArray1 = array($name,$dob,$cty); $paramArray2 = array($cty); $columnArray1 = array("name","dob","cty"); $columnArray2 = array("cty"); $query = "select f_name, age, address from table1"; pdo_db_query($query,$columnArray2) ; print_r($paramArray2); ?>