2015-09-10 60 views
3

我很抱歉坏头衔,但我不知道更好的选择。PHP从类型和名称搜索

当前我正在创建搜索引擎以获取产品详细信息。我有2种搜索类型,第一种是使用产品类型进行搜索,另一种是使用产品名称。

下面是搜索代码:

<?php 
$search_exploded = explode (" ", $search); 

$x = ""; 
$construct = ""; 

foreach ($search_exploded as $search_each) { 
    $x++; 
    if ($x==1) 
     $construct .="product_type LIKE '%$search_each%'"; 
    else 
     $construct .="AND product_type LIKE '%$search_each%'"; 
} 
?> 

,这是数据获取的代码。

$results = $mysqli->query("SELECT * FROM produk2 WHERE $construct"); 
if ($results) { 

    //fetch results set as object and output HTML 
    while ($obj = $results->fetch_object()) { 
     echo '<div class="product">'; 
     echo '<form method="post" action="cart_update.php">'; 
     echo '<div class="product-thumb"><img src="images/'.$obj- >product_img_name.'"></div>'; 
     echo '<div class="product-content"><h3>'.$obj->product_name.'</h3>'; 
     echo '<div class="product-desc">'.$obj->product_desc.'</div>'; 
     echo '<div class="product-info">'; 
     echo 'Price '.$currency.$obj->price.' | '; 
     echo 'Qty <input type="text" name="product_qty" value="1" size="3" />'; 
     echo '<button class="add_to_cart">Add To Cart</button>'; 
     echo '</div></div>'; 
     echo '<input type="hidden" name="product_code" value="'.$obj->product_code.'" />'; 
     echo '<input type="hidden" name="type" value="add" />'; 
     echo '<input type="hidden" name="return_url" value="'.$current_url.'" />'; 
     echo '</form>'; 
     echo '</div>'; 
    } 

如何从product_type数据搜索改为product_name,反之亦然,根据什么我是从用户输入的故事吗?

因为我英语不好,我无法更好地解释它。

+2

您的结构'连接缺少空间的一件事。你应该得到语法错误,但你可能没有检查它们。例如'。=“AND'应该读作''=”AND' –

+0

在头部的顶部,我使用$ search = $ _GET ['search_value'];从另一个页面获取数据。 –

+0

fred,对于product_type,构造工作得很好,但我不知道如何在产品类型和名称之间进行更改 –

回答

4

您可以使其成为OR条件,而不是像下面那样。这样,无论uset类型将应用于这两列,并且因为它是一个OR条件,它将返回true,如果两者匹配。

where product_type LIKE '%$search_each%' 
or product_name LIKE '%$search_each%'; 

修改你的下面的代码段

if ($x==1) 
    $construct .="product_type LIKE '%$search_each%'"; 
else 
    $construct .="AND product_type LIKE '%$search_each%'"; 

$construct .="product_type LIKE '%$search_each%' OR product_name LIKE '%$search_each%'"; 
+0

如何在我的源代码中实现? –

+0

@MohdFadli,如果有帮助,请参阅编辑答案。 – Rahul

0

你说的英语很差,所以请纠正我,如果我误解了问题:您要使用单个方法根据搜索类型搜索两个字段之一?

如果是这样的话:这是我经常使用的设计模式。它基本上是一个类似于工厂的映射器类。我在这里使用了一个类,因为我通常做的远不止这些(有它选择不同的表和各种各样的东西)。如果您只需映射两个字段,则可以将其重写为程序。

<?php 
$search_exploded = explode(" ", $search); 

$x = ""; 
$construct = ""; 

$mapper = new Mapper(); 

foreach ($search_exploded as $search_each) { 
    $x++; 

    // pass in what you want to map. in this example, it will take either prodtype or prodname, and return the field that you want 
    $tablename = $mapper->getMap(); 
    if ($x == 1) 
    $construct .= "$tablename LIKE '%$search_each%'"; 
    else 
    $construct .= "AND $tablename LIKE '%$search_each%'"; 

} 

class Mapper 
{ 
    public $map = array(
     'prodtype' => 'product_type', 
     'prodname' => 'product_name' 
); 

    public function getMap($forsearch) 
    { 
    return $this->map[$forsearch]; 
    } 
} 
0

尝试将您的代码更改为。

foreach ($search_exploded as $search_each) { 
    $x++; 
    if ($x==1) 
     $construct .="product_type LIKE '%$search_each%'"; 
    else 
     $construct .="OR product_type LIKE '%$search_each%'"; 
} 
?> 

在这种情况下,无论用户给出什么输入,它都会得到数据。