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