MYSQLI подготовил оператор с неизвестным количеством переменных - PullRequest
0 голосов
/ 19 февраля 2019

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

Приведенный ниже код работает, если опубликованы все параметры поиска:

$stmt = $connection->prepare("
SELECT
COUNT(id) AS totalCount,
ROUND(AVG(pushups)) AS pushups,
ROUND(AVG(crunches)) AS crunches,
ROUND(AVG(age)) AS age,
ROUND(AVG(weight)) AS weight,
ROUND(AVG(height)) AS height,
ROUND(AVG(treadtimemin)) AS treadtimemin,
ROUND(AVG(treadhr)) AS treadhr,
ROUND(AVG(treadtimesec)) AS treadtimesec,
ROUND(AVG(age)) AS age
FROM
`Fittest`
WHERE
prepost = 'pre' AND semester = ? AND course = ? AND section = ? AND 
YEAR(submitted) = ?
");  

    $stmt->bind_param( "ssss", $semester,$CourseNumber, 
$SectionNumber, $year);
    $stmt->execute();

Вот код, с которым я работаю, для работы с неизвестным числом переменных, но я не понимаюкласс достаточно хорош, чтобы собрать его правильно.Я знаю, что я близко, но без сигары.

$bindParam = new BindParam(); 
$qArray = array(); 

$query = 'COUNT(id) AS totalCount,
ROUND(AVG(pushups)) AS pushups,
ROUND(AVG(crunches)) AS crunches,
ROUND(AVG(age)) AS age,
ROUND(AVG(weight)) AS weight,
ROUND(AVG(height)) AS height,
ROUND(AVG(treadtimemin)) AS treadtimemin,
ROUND(AVG(treadhr)) AS treadhr,
ROUND(AVG(treadtimesec)) AS treadtimesec,
ROUND(AVG(age)) AS age
FROM
`Fittest` WHERE  prepost = pre  AND   '; 
if($_POST['SectionNumber']){ 
$qArray[] = 'SectionNumber = ?'; 
$bindParam->add('s', $_POST['SectionNumber']); 
} 
if($_POST[ 'semester' ]){ 
$qArray[] = 'semester = ?'; 
$bindParam->add('s', $_POST[ 'semester' ]); 
} 
if($_POST[ 'CourseNumber' ]){ 
$qArray[] = 'CourseNumber = ?'; 
$bindParam->add('s', $_POST[ 'CourseNumber' ]); 
} 
if($_POST[ 'year' ]){ 
$qArray[] = 'YEAR(submitted) = ?'; 
$bindParam->add('s', $_POST[ 'year' ]); 
} 

$query .= implode(' AND ', $qArray); 

call_user_func_array( array($stm, 'bind_param'), $bindParam->get()); 
$stmt->execute();

//echo $query . '<br/>'; 
//var_dump($bindParam->get()); 

class BindParam{ 
private $values = array(), $types = ''; 

public function add( $type, &$value ){ 
    $this->values[] = $value; 
    $this->types .= $type; 
} 

public function get(){ 
    return array_merge(array($this->types), $this->values); 
} 
} 

Это мой вывод, когда я повторяю запрос и выполняю var_dump:

COUNT(id) AS totalCount, ROUND(AVG(pushups)) AS pushups, 
ROUND(AVG(crunches)) AS crunches, ROUND(AVG(age)) AS age, 
ROUND(AVG(weight)) AS weight, ROUND(AVG(height)) AS height, 
ROUND(AVG(treadtimemin)) AS treadtimemin, ROUND(AVG(treadhr)) AS treadhr, 
ROUND(AVG(treadtimesec)) AS treadtimesec, ROUND(AVG(age)) AS age FROM 
`Fittest` WHERE prepost = pre AND SectionNumber = ? AND semester = ? AND 
CourseNumber = ? AND YEAR(submitted) = ?
array(5) { [0]=> string(4) "ssss" [1]=> string(4) "5015" [2]=> string(4) 
"Fall" [3]=> string(9) "PHED 1164" [4]=> string(4) "2018" }

Это выглядит правильно, но я нене знаю, как интегрировать это.Например, как будет выглядеть мой последний фрагмент кода при интеграции части соединения: $stmt = $connection->prepare("....

Я пытался найти учебники по этому вопросу, но не смог найти полных примеров.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...