2016-11-24 1 views
1

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

шрифта концевая часть из отборных коробок

<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 консоль возвращает ошибку:

Failed to load resource: the server responded with a status of 404 (Not Found)

ответ

4

Позвольте мне задать вам вопрос. Вы отметили это как веб-сайт WordPress. Верный? Тогда почему вы не используете встроенный обработчик базы данных, $wpdb как для подготовки, так и для связи с базой данных? Это самый безопасный и быстрый способ работать с базой данных.

Revised Code

Здесь я пересмотрел свой код, чтобы сделать следующее:

  • Использование $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; 
} 

UPDATE: стратегия для Вас

Теперь, когда я видел HTML код, который вы предлагаете, а также зная, что вы изучаете о создавая веб-сайты, давайте поговорим о другой архитектурной стратегии для вашего проекта.

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

ТАМОЖЕННЫЙ ПОСТ Тип

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

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

Где вы узнаете о пользовательских типах сообщений?

Ну, есть много уроков. Codex дает вам документацию и примеры. Я преподаю его по адресу Know the Code. У Tuts + есть много учебников. И многие другие ....

Почему Custom Post Type вместо Custom Db Table?

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

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

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

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

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

Cheers.

+0

Я только начинаю учиться создавать веб-сайт с помощью WordPress. Спасибо, что помогли мне больше узнать о правилах WordPress.Я просто редактирую вопрос, чтобы добавить HTML для полей. Интересно, следует ли добавить динамически зависимую часть. –

+0

С помощью своего способа, как печатать каждую строку результатов поиска? Я пробовал, но не могу понять. –

+0

@ L.Leo Я поправьте свой ответ выше, чтобы предложить рекомендованную стратегию для вашего проекта. Я рекомендую использовать пользовательский тип сообщения вместо таблицы пользовательских баз данных. Это сэкономит вам время, деньги и разочарования. Кроме того, это лучшая стратегия для вашего клиента, поскольку она хорошо интегрирована в WordPress CMS. – hellofromTonya

Смежные вопросы