簡體   English   中英

在字段PHP mysql查詢中檢查逗號分隔值

[英]Check Comma Seperated Values in field PHP mysql query

我在一個名為filter的表中有一個字段,它可以有逗號分隔的值1,2,3或3,1或更大,我只需要選擇與字段中的這些記錄匹配的那些記錄,假設有人發送1,3並且必須存在於過濾器領域,即操作。

我正在使用FIND_IN_SET並且對於單個值工作正常,假設有人發送1並且正在獲取正確的記錄,但是如果有人發送逗號分隔了1,3,則給出以下錯誤

查詢無效:對本地函數“ FIND_IN_SET”的調用中的參數計數不正確

對於單個記錄,我正在使用以下查詢,並且工作正常。

SELECT shoptitle,
        logopic,
        complocality, 
        profileurl, 
        lat, 
        lng,
        mageuserid,
        compdesi,
        deliverymin,
        deleiveryprice,
        deleiverymethod,
        vendorphone,
        compcity,
        compstate,
        zipcode,
        showcompleteaddress,
        ( 3959 * acos( cos( radians('33.8352932') ) * cos( radians( lat ) ) * cos( radians( lng ) - radians('-117.91450359999999') ) + sin( radians('33.8352932') ) * sin( radians( lat ) ) ) ) AS distance 
FROM userdata 
WHERE FIND_IN_SET (1,filter) 
HAVING distance < '10'   
ORDER BY distance

您必須使用以下代碼檢查字符串是否包含逗號

sqlvalue="1,2,3,4";
   $HiddenProducts = explode(',',$sqlvalue);
if (in_array(1, $HiddenProducts)) {
  echo "Available";
}
if (in_array(3, $HiddenProducts)) {
  echo "available";
}

最好的解決方案是規范化數據庫,刪除用逗號分隔的值列表。 這些問題是,很難檢查多個值(如您所發現的),但是即使對於單個值,任何檢查都不會使用索引,因此會很慢。

如果沒有需要將列表拆分以進行檢查,然后對每個列表使用FIND_IN_SET來檢查它是否在該字段中。

像這樣的東西:

$some_values = "1,3";

$some_values_array = explode(',', $some_values);

$Some_checks = "FIND_IN_SET ('".implode("',filter) AND FIND_IN_SET ('", $some_values_array).")";

$sql = "SELECT shoptitle,
            logopic,
            complocality, 
            profileurl, 
            lat, 
            lng,
            mageuserid,
            compdesi,
            deliverymin,
            deleiveryprice,
            deleiverymethod,
            vendorphone,
            compcity,
            compstate,
            zipcode,
            showcompleteaddress,
            ( 3959 * acos( cos( radians('33.8352932') ) * cos( radians( lat ) ) * cos( radians( lng ) - radians('-117.91450359999999') ) + sin( radians('33.8352932') ) * sin( radians( lat ) ) ) ) AS distance 
    FROM userdata 
    WHERE $Some_checks
    HAVING distance < '10'   
    ORDER BY distance";

嚴格來說,可以在SQL中執行此操作,但是這樣做非常恐怖,難以維護,同時速度也較慢。

就我而言,我做了以下解決方案:

        $filter = '1,2,3,4,5';
        $newbreak = explode(",",$filter);
        $checksize  = sizeof($newbreak);

        if ($checksize == 2)
        {
            $new = "FIND_IN_SET (".$newbreak[0].",filter) AND FIND_IN_SET (".$newbreak[1].",filter)";
        }elseif($checksize == 3)
        {
            $new = "FIND_IN_SET (".$newbreak[0].",filter) AND FIND_IN_SET (".$newbreak[1].",filter) AND FIND_IN_SET (".$newbreak[2].",filter)";
        }
        elseif($checksize == 4)
        {
            $new = "FIND_IN_SET (".$newbreak[0].",filter) AND FIND_IN_SET (".$newbreak[1].",filter) AND FIND_IN_SET (".$newbreak[2].",filter) AND FIND_IN_SET (".$newbreak[3].",filter)";
        }
        elseif($checksize == 5)
        {
            $new = "FIND_IN_SET (".$newbreak[0].",filter) AND FIND_IN_SET (".$newbreak[1].",filter) AND FIND_IN_SET (".$newbreak[2].",filter) AND FIND_IN_SET (".$newbreak[3].",filter) AND FIND_IN_SET (".$newbreak[5].",filter) ";
        }else
        {

        }
$query =
 sprintf("SELECT * ,( 3959 * acos( cos( radians('%s') ) * 
cos( radians( lat ) ) * cos( radians( lng ) - radians('%s') ) + sin( radians('%s') ) 
* sin( radians( lat ) ) ) ) AS distance FROM userdata WHERE 
$new HAVING distance < '%s'   ORDER BY distance",
                    mysql_real_escape_string($center_lat),
                    mysql_real_escape_string($center_lng),
                    mysql_real_escape_string($center_lat),
                    mysql_real_escape_string($radius));

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM