我正在尝试编写一个保存搜索功能,用户可以在其中保存他们的搜索,但我需要一些帮助来检查当前进行搜索的用户的数据库中是否已经存在搜索。起初,我将搜索变量作为序列化数组发送到数据库,但在阅读了大量关于不这样做的内容后,我现在使用json变量添加到数据库。
到目前为止,我已经:
$url = (isset($_SERVER[\'HTTPS\']) ? "https" : "http") . "://$_SERVER[HTTP_HOST]$_SERVER[REQUEST_URI]";
$escaped_url = htmlspecialchars( $url, ENT_QUOTES, \'UTF-8\' );
$query_str = parse_url($url, PHP_URL_QUERY);
parse_str($query_str, $query_params);
$query_params[contract_type] = $term_id;
$query_params[url] =$url;
// $search_data = maybe_serialize($query_params ); USING PHP VARIABLES AND SERIALIZE
$json = json_encode($query_params);
以上内容获取URL和参数并编码到数组中。单击ajax click事件时,会将其插入user\\u meta。
{"ptype":"2675","minprice":"0","maxprice":"180000","plocation":"0","pbtsstation":"0","pbeds":"1","pbaths":"0","pgarages":"0","sort-properties":"price-asc","contract_type":34,"url":"http:\\/\\/mywebsite\\/en\\/for\\/rent\\/?ptype=2675&minprice=0&maxprice=180000&plocation=0&pbtsstation=0&pbeds=1&pbaths=0&pgarages=0&sort-properties=price-asc"}
我需要的帮助是,在php-ajax函数中,我需要获取所有现有的user\\u搜索,并比较新提交的搜索,看看它是否已经存在
这是我的PHP ajax函数:
/*-----------------------------------------------------------------------------------*/
/* Add to saved Search
/*-----------------------------------------------------------------------------------*/
add_action(\'wp_ajax_save_this_search\', \'save_this_search\');
if( !function_exists( \'save_this_search\' ) ){
function save_this_search(){
if( isset($_POST[\'user_id\']) ){
$user_id = intval($_POST[\'user_id\']);
$search_params = $_POST[\'params\'];
if( add_user_meta( $user_id, \'_saved_searches\', $search_params ) ){
/* success */
}else{
_e(\'Failed!\', \'framework\');
}
}else{
_e(\'Invalid Parameters!\', \'framework\');
}
die;
}
}
这是我的ajax功能:
/*-----------------------------------------------------------------------------------*/
/* Save this search
/*-----------------------------------------------------------------------------------*/
$(\'#save-this-search\').click(function(e){
e.preventDefault();
var $this = $(this);
var loader = $this.siblings(\'.ajax-loader\');
var save_this_search_options = {
beforeSubmit: function(){
loader.show();
}, // pre-submit callback
success: function(){
$(\'#save-this-search\').attr(\'id\',\'noLink\');
$this.addClass("active");
loader.hide();
}
};
$(\'#save-this-search-form\').ajaxSubmit( save_this_search_options );
});
我不确定在何处或如何将此签入,是将其放入php函数中,还是在提交前的ajax函数中:function(){
在用户仪表板页面(前端)中,这是我用来抓取已保存搜索的内容,这一切都很好。
$sql = " SELECT * FROM `wp_usermeta` WHERE `meta_key` = \'_saved_searches\' AND `user_id` = $user_id ORDER BY `umeta_id` DESC ";
$mySavedSearches = $wpdb->get_results( $sql );
foreach($mySavedSearches as $key=>$value){
$mySavedSearchesOutput[] = json_decode($value->meta_value, TRUE);
}
foreach ($mySavedSearchesOutput as $SavedSearches){ // using json array
$mySavedSearch = is_array($SavedSearches) ? $SavedSearches : array();
我真的希望我已经以一种不太冗长的方式解释了这一点,并且有人可以建议在哪里以及如何进行检查。
最合适的回答,由SO网友:Malisa 整理而成
对于其他人,或者对于可能给出更好、更整洁、更专业答案的人,这就是我最终要做的:
首先,我添加了一个函数来比较新的搜索数据($newSearch):
function identical_values( $arrayA , $arrayB ) {
sort( $arrayA );
sort( $arrayB );
return $arrayA == $arrayB;
}
保持从URL获取变量的相同方法:
$url = (isset($_SERVER[\'HTTPS\']) ? "https" : "http") . "://$_SERVER[HTTP_HOST]$_SERVER[REQUEST_URI]";
$escaped_url = htmlspecialchars( $url, ENT_QUOTES, \'UTF-8\' );
$query_str = parse_url($url, PHP_URL_QUERY);
parse_str($query_str, $query_params);
$query_params[contract_type] = $term_id;
$query_params[url] =$url;
然后添加代码以运行存储在数据库中的所有已保存搜索:
$newSearch = (array) $query_params;
$sql = " SELECT * FROM `wp_usermeta` WHERE `meta_key` = \'_saved_searches\' AND `user_id` = $user_id ORDER BY `umeta_id` DESC ";
$mySavedSearches = $wpdb->get_results( $sql );
foreach($mySavedSearches as $key=>$value){
$mySavedSearchesOutput = json_decode($value->meta_value, TRUE);
$identical = identical_values( $newSearch , $mySavedSearchesOutput );
if($identical) break;
}
此部分,如果已保存,则防止双击链接:
if($identical):
echo \' <li class="save-search active"></li>\';
else:
echo \' <li id="save-this-search" class="save-search" data-user-id="\'. $user_id.\'"><span class="ajax-loader hide"><i class="fa fa-spinner fa-spin"></i></span></li>\';
endif;
它不漂亮,甚至可能不安全,但目前效果很好:)