Объедините результаты нескольких полей выбора с помощью PHP и MySQL в WordPress

У меня есть 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)

1

Решение

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

  1. Не используйте пользовательскую таблицу базы данных.
  2. Используйте пользовательский тип записи под названием products вместо.
  3. Используйте метаданные поста, чтобы установить атрибуты для каждого продукта, то есть производителя, модель, год, тип и т. Д.
  4. Используйте плагин формы, такой как Ninja Forms.
  5. Вы можете создать метаданные для метаданных самостоятельно, если у вас есть технические возможности для этого. Иначе, вы можете использовать сторонний плагин, такой как CMB2 или ACF.

Пользовательский тип сообщения

WordPress предоставляет вам возможность добавлять пользовательский контент. Они предоставляют встроенные типы сообщений. Мы разработчики можем добавить пользовательские, которые являются определенным контентом контента. Продукция является хорошим кандидатом для пользовательского типа сообщения.

Вы можете сгенерировать код на GenerateWP. Это буквально несколько строк кода для его создания.

Где вы можете узнать о пользовательских типах постов?

Ну, есть много учебников. кодекс дает вам документацию и примеры. Я преподаю это в Знать код. Тутс + имеет множество учебных пособий. И много других….

Почему пользовательский тип записи вместо пользовательской таблицы БД?

Да, вы можете создать собственную таблицу базы данных. Но для этого необходимо добавить схему, заполнить таблицу, написать интерфейс для взаимодействия администраторов с контентом, а затем написать и обезопасить взаимодействие. Чтобы заполнить параметры в select, вам придется запросить базу данных, используя $wpdb а затем напишите модель, чтобы перевести ее в представление. Затем вам нужно написать обработку формы для взаимодействия и сохранения.

Другими словами, это будет стоить вам времени и денег. Зачем? Потому что это больше кода, а не родной для WordPress. Вы должны написать, защитить, протестировать и поддерживать его самостоятельно.

Если вы хотите придерживаться своей текущей стратегии

Если вы предпочитаете придерживаться стратегии таблицы пользовательских баз данных, вот несколько советов, которые могут вам помочь:

  1. Вам не нужно скрытое input для каждого из select элементы. Зачем? Когда форма размещена, опция устанавливается для каждого select отправит обратно на сервер.
  2. Я бы поменял select имена должны быть массивом, например так: name="part-select[manufacturer]" и затем повторите для типа, модели, года и т. д. Затем вы можете взять $_POST['part-select'] чтобы получить все значения.
  3. Вы хотите добавить данное время защищать контент. Обязательно передайте его вместе с пакетом данных, когда выполняете AJAX.
  4. С помощью AJAX, Вы можете запросить записи из базы данных. Вам нужно будет изменить код, который я вам дал, чтобы построить запрос SQL. Затем переберите результаты, чтобы создать HTML-код, который вы хотите отправить обратно во внешний интерфейс.
  5. Мне нравится создавать разметку HTML на стороне сервера, а затем отправлять ее обратно во внешний интерфейс при выполнении AJAX.

Приветствия.

4

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]