У меня есть 4 динамически зависимых блока выбора, теперь я хочу объединить результат 4 выборок в запрос. У меня есть все относительный код ниже.
конец шрифта часть полей выбора
<form class="select-boxes" action="<?php echo site_url("/part-search-result/"); ?>" method="POST" target="_blank">
<?php include(__DIR__.'/inc/part-search.php'); ?>
</form>
part-search.php
<?php
include( __DIR__.'/db-config.php' );
$query = $db->query("SELECT * FROM ps_manufact WHERE status = 1 ORDER BY manufact_name ASC");
$rowCount = $query->num_rows;
?>
<select name="manufacturer" id="manufact" onchange="manufactText(this)">
<option value="">Select Manufacturer</option>
<?php
if($rowCount > 0){
while($row = $query->fetch_assoc()){
echo '<option value="'.$row['manufact_id'].'">'.$row['manufact_name'].'</option>';
}
}else{
echo '<option value="">Manufacturer Not Available</option>';
}
?>
</select>
<input id="manufacturer_text" type="hidden" name="manufacturer_text" value=""/>
<script type="text/javascript">
function manufactText(ddl) {
document.getElementById('manufacturer_text').value = ddl.options[ddl.selectedIndex].text;
}
</script>
<select name="type" id="type" onchange="typeText(this)">
<option value="">Select Manufacturer First</option>
</select>
<input id="type_text" type="hidden" name="type_text" value=""/>
<script type="text/javascript">
function typeText(ddl) {
document.getElementById('type_text').value = ddl.options[ddl.selectedIndex].text;
}
</script>
<select name="year" id="year" onchange="yearText(this)">
<option value="">Select Type First</option>
</select>
<input id="year_text" type="hidden" name="year_text" value=""/>
<script type="text/javascript">
function yearText(ddl) {
document.getElementById('year_text').value = ddl.options[ddl.selectedIndex].text;
}
</script>
<select name="model" id="model" onchange="modelText(this)">
<option value="">Select Year First</option>
</select>
<input id="model_text" type="hidden" name="model_text" value=""/>
<script type="text/javascript">
function modelText(ddl) {
document.getElementById('model_text').value = ddl.options[ddl.selectedIndex].text;
}
</script>
<input type="submit" name="search" id="search" value="Search"><script type="text/javascript">
jQuery(function($) {
$('#manufact').on('change',function(){
var manufactID = $(this).val();
if(manufactID){
$.ajax({
type:'POST',
url:'<?php echo home_url('wp-content/themes/myTheme/inc/ajax-data.php') ?>',
data:'manufact_id='+manufactID,
success:function(html){
$('#type').html(html);
$('#year').html('<option value="">Select Type First</option>');
}
});
}else{
$('#type').html('<option value="">Select Manufact First</option>');
$('#year').html('<option value="">Select Type First</option>');
}
});
$('#type').on('change',function(){
var typeID = $(this).val();
if(typeID){
$.ajax({
type:'POST',
url:'<?php echo home_url('wp-content/themes/myTheme/inc/ajax-data.php') ?>',
data:'type_id='+typeID,
success:function(html){
$('#year').html(html);
$('#model').html('<option value="">Select Year First</option>');
}
});
}else{
$('#year').html('<option value="">Select Type First</option>');
$('#model').html('<option value="">Select Year First</option>');
}
});
$('#year').on('change',function(){
var yearID = $(this).val();
if(yearID){
$.ajax({
type:'POST',
url:'<?php echo home_url('wp-content/themes/myTheme/inc/ajax-data.php') ?>',
data:'year_id='+yearID,
success:function(html){
$('#model').html(html);
}
});
}else{
$('#model').html('<option value="">Select Year First</option>');
}
});
});
</script>
ajax-data.php
<?php
include( __DIR__.'/db-config.php' );
if(isset($_POST["manufact_id"]) && !empty($_POST["manufact_id"])){
$query = $db->query("SELECT * FROM ps_type WHERE manufact_id = ".$_POST['manufact_id']." AND status = 1 ORDER BY type_name ASC");
$rowCount = $query->num_rows;
if($rowCount > 0){
echo '<option value="">Select Type</option>';
while($row = $query->fetch_assoc()){
echo '<option value="'.$row['type_id'].'">'.$row['type_name'].'</option>';
}
}else{
echo '<option value="">Type Not Available</option>';
}
}
if(isset($_POST["type_id"]) && !empty($_POST["type_id"])){
$query = $db->query("SELECT * FROM ps_year WHERE type_id = ".$_POST['type_id']." AND status = 1 ORDER BY year_name ASC");
$rowCount = $query->num_rows;
if($rowCount > 0){
echo '<option value="">Select Year</option>';
while($row = $query->fetch_assoc()){
echo '<option value="'.$row['year_id'].'">'.$row['year_name'].'</option>';
}
}else{
echo '<option value="">Year Not Available</option>';
}
}
if(isset($_POST["year_id"]) && !empty($_POST["year_id"])){
$query = $db->query("SELECT * FROM ps_model WHERE year_id = ".$_POST['year_id']." AND status = 1 ORDER BY model_name ASC");
$rowCount = $query->num_rows;
if($rowCount > 0){
echo '<option value="">Select Model</option>';
while($row = $query->fetch_assoc()){
echo '<option value="'.$row['model_id'].'">'.$row['model_name'].'</option>';
}
}else{
echo '<option value="">Model Not Available</option>';
}
}
?>
part-search-result.php
<?php
if (isset($_POST['search'])) {
$clauses = array();
if (isset($_POST['manufacturer_text']) && !empty($_POST['manufacturer_text'])) {
$clauses[] = "`manufacturer` = '{$_POST['manufacturer_text']}'";
}
if (isset($_POST['type_text']) && !empty($_POST['type_text'])) {
$clauses[] = "`type` = '{$_POST['type_text']}'";
}
if (isset($_POST['year_text']) && !empty($_POST['year_text'])) {
$clauses[] = "`year` = '{$_POST['year_text']}'";
}
if (isset($_POST['model_text']) && !empty($_POST['model_text'])) {
$clauses[] = "`model` = '{$_POST['model_text']}'";
}
$where = !empty( $clauses ) ? ' where '.implode(' and ',$clauses ) : '';
$sql = "SELECT * FROM `wp_products` ". $where;
$result = filterTable($sql);
} else {
$sql = "SELECT * FROM `wp_products` WHERE `manufacturer`=''";
$result = filterTable($sql);
}
function filterTable($sql) {
$con = mysqli_connect("localhost", "root", "root", "i2235990_wp2");
if (!$con) {
die('Could not connect: ' . mysqli_error($con));
}
$filter_Result = mysqli_query($con, $sql);
return $filter_Result;
}
?>
<?php get_header(); ?>
<div class="container">
<div id="products" class="row list-group">
<?php while ( $rows = mysqli_fetch_array($result) ): ?>
<div class="item col-xs-12 col-sm-4 col-md-4 col-lg-4">
<div class="thumbnail">
<?php
echo '<img name="product-image" class="group list-group-image hvr-bob" src=' . $rows['image_url'] . ' width="400px" height="250px" alt="" />';
?>
<div class="caption">
<h4 class="group inner list-group-item-heading">
<?php
echo "Manufacturer:\t".$rows['manufacturer'].'<br>';
echo "Type:\t".$rows['type'].'<br>';
echo "Year:\t".$rows['year'].'<br>';
echo "Model:\t".$rows['model'].'<br>';
echo '<br>';
echo "Description:\t".$rows['description'].'<br>';
?>
</h4>
</div>
</div>
</div>
<?php endwhile; ?>
</div>
</div>
<?php get_footer(); ?>
Теперь моя проблема:
Если выбран только первый блок, либо выберите первые два блока и щелкните Search
Кнопка успешно переходит на страницу результатов. Однако, если непрерывно выбирать третье поле, страница результатов исчезает, и Chrome Console возвращает ошибку:
Failed to load resource: the server responded with a status of 404 (Not Found)
Позвольте мне задать вам вопрос. Вы отметили это как веб-сайт WordPress. Правильный? Тогда почему вы не используете встроенный обработчик базы данных, $wpdb
как подготовить и общаться с базой данных? Это самый безопасный и быстрый способ работы с базой данных.
Пересмотренный код
Здесь я изменил ваш код, чтобы сделать следующее:
$wpdb->prepare
санировать $_POST
значения для защиты базы данных от гнусных людей_text
к названию столбца$wpdb->get_results()
пойти за результатами.Вот пересмотренный код:
/**
* Build the search's WHERE SQL from the form's $_POST fields.
*
* @since 1.0.0
*
* @return string
*/
function build_search_where_sql() {
global $wpdb;
$column_names = array(
'manufacturer',
'type',
'year',
'model',
);
$where_clauses = [];
foreach( $column_names as $column_name ) {
$post_key = $column_name . '_text';
if ( isset( $_POST[ $post_key ] ) && $_POST[ $post_key ] ) {
$where_clauses[] = $wpdb->prepare( "{$column_name} = %s", $_POST[ $post_key ] );
}
}
if ( empty( $where_clauses ) ) {
return '';
}
$where_sql = " WHERE " . join( ' AND ', $where_clauses );
return $where_sql;
}
/**
* Get the search results from the database. If the records
* do not exist or an error occurs, false is returned. Else,
* an array with stdClass objects for each record is returned.
*
* @since 1.0.0
*
* @return bool|array
*/
function get_search_database_results() {
$where_sql = isset( $_POST['search'] )
? build_search_where_sql()
: "WHERE manufacturer = ''";
if ( ! $where_sql ) {
return false;
}
global $wpdb;
$sql_query = "SELECT * FROM wp_products {$where_sql};";
$records = $wpdb->get_results( $sql_query );
if ( ! $records ) {
return false;
}
return $records;
}
ОБНОВЛЕНИЕ: стратегия для вас
Теперь, когда я увидел предлагаемый вами HTML-код, а также узнал, что вы учитесь создавать веб-сайты, давайте поговорим о другой архитектурной стратегии для вашего проекта.
products
вместо.Пользовательский тип сообщения
WordPress предоставляет вам возможность добавлять пользовательский контент. Они предоставляют встроенные типы сообщений. Мы разработчики можем добавить пользовательские, которые являются определенным контентом контента. Продукция является хорошим кандидатом для пользовательского типа сообщения.
Вы можете сгенерировать код на GenerateWP. Это буквально несколько строк кода для его создания.
Где вы можете узнать о пользовательских типах постов?
Ну, есть много учебников. кодекс дает вам документацию и примеры. Я преподаю это в Знать код. Тутс + имеет множество учебных пособий. И много других….
Почему пользовательский тип записи вместо пользовательской таблицы БД?
Да, вы можете создать собственную таблицу базы данных. Но для этого необходимо добавить схему, заполнить таблицу, написать интерфейс для взаимодействия администраторов с контентом, а затем написать и обезопасить взаимодействие. Чтобы заполнить параметры в select
, вам придется запросить базу данных, используя $wpdb
а затем напишите модель, чтобы перевести ее в представление. Затем вам нужно написать обработку формы для взаимодействия и сохранения.
Другими словами, это будет стоить вам времени и денег. Зачем? Потому что это больше кода, а не родной для WordPress. Вы должны написать, защитить, протестировать и поддерживать его самостоятельно.
Если вы хотите придерживаться своей текущей стратегии
Если вы предпочитаете придерживаться стратегии таблицы пользовательских баз данных, вот несколько советов, которые могут вам помочь:
input
для каждого из select
элементы. Зачем? Когда форма размещена, опция устанавливается для каждого select
отправит обратно на сервер.select
имена должны быть массивом, например так: name="part-select[manufacturer]"
и затем повторите для типа, модели, года и т. д. Затем вы можете взять $_POST['part-select']
чтобы получить все значения.Приветствия.
Других решений пока нет …