MYSQLI подготовил оператор с неизвестным количеством переменных
Пользователи отправляют форму, в которой они могут или не могут выбрать все доступные параметры поиска.
Код ниже работает, если опубликованы все параметры поиска:
$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("....
Я пытался найти учебники по этому вопросу, но не смог найти полных примеров.
Заранее спасибо,
Тим