2016-08-24 4 views
1

Мне нужно сделать что-то, что, я уверен, это просто, но я читаю и читаю информацию повсюду и не могу найти решение для этого. Я знаю, я ноб, но я действительно не знаю, что еще попробовать.Несериализуйте значение, полученное из db на php

Существует линия на одном из PHP файлов темы моего веб-сайта, который выглядит так:

global $post; 
if (!is_page()) {$category_ID = get_post_meta($post->ID, '_category_permalink', true);} 
    else {$category_ID = '';} 
$category_parent = pa_category_top_parent_id ($category_ID); 

Дело в том, что «_category_permalink» значение в базе данных не всегда является целым числом, а Мне это нужно. Иногда значение сериализованного значение, что-то вроде этого:

a:1:{s:8:"category";s:2:"23";} 

Таким образом, $ CATEGORY_ID иногда 23 (или любое другое число), а в других случаях является: 1: {s: 8: "категория"; s: 2: "23";} (и другие значения).

Что мне нужно сделать, это то, что можно проверить, это значение, полученное после того, как эта строка является целым числом или нет. В случае, если это так, мне нужно его неэтериализовать и преобразовать в соответствующий целочисленный номер, сохраненный в разделе «категория» этого сериализованного значения (из моего примера, номер 23), поэтому $ category_ID всегда будет равен целому числу число, а не сериализованное значение.

Как я могу это сделать?

Заранее спасибо :)

EDIT & UPDATE:

Это было решено, код в конечном итоге, как этот

if (!is_page()) { $category_ID = get_post_meta($post->ID, '_category_permalink', true); } else {$category_ID = '';}  
global $wpdb; 
$catmeta = $wpdb->get_row("SELECT post_id, meta_key, meta_value FROM MYDATABASENAMEHERE WHERE post_id = '".$post->ID."' AND meta_key LIKE '_category_permalink'",ARRAY_A); 

if(strpos($catmeta['meta_value'],':{')!==false){ 
$catmeta = unserialize($catmeta['meta_value']); 
$catmeta['meta_value'] = $catmeta['category']; 
} 

$category_parent = pa_category_top_parent_id ($catmeta['meta_value']); 
+0

Вы можете проверить значение, если числовое или нет 'is_numeric()'. –

ответ

0

Первая проверка если $category_ID это число с помощью is_number().

Если нет, так что используйте unserialize(), чтобы преобразовать его в array и проверить category:

if (is_numeric($category_ID)) { 
    # $category_ID is number, use it 
    # your code here... 
} else { 
    # $category_ID is a serialized value 
    $cat = unserialize($category_ID); 
    $category_ID = intval($cat['category']); 
} 
+0

Проблема с этим значением не всегда одинакова, поэтому я не могу добавить ее так. $ str может быть целым числом или сериализованным значением. Сериализованное форматирование одинаковое, но не то же точное значение. – Shinji3rd

+0

@ Shinji3rd Проверьте, действительно ли '$ category_ID' является номером, как указано в моем ответе. Если это число, используйте его. В противном случае перейдите к 'unserialize()'. См. Мой обновленный ответ – Jason

+0

Ок, is_number не работает. Вместо этого команда is_numeric. Но хотя по логике это должно работать, в этом случае это не так. Наконец, после большого расследования, я нашел решение. Мое оригинальное сообщение было отредактировано, чтобы включить его. Спасибо за вашу помощь! – Shinji3rd

0

Не волнуйтесь. Вы можете проверить, если это число с помощью этого кода:

//check if is numeric 
if(is_numeric($category_parent)){ 
    $category_parent_id = $category_parent; 
    } else { 
    //if is array unserialize 
    $category_parent_array = unserialize($category_parent); 
    //use array to get the id 
    $category_parent_id = $category_parent_array['category']; 
    } 
+0

Этот код выглядел многообещающим, и я попробовал, но он не работает. Я немного изменил его, потому что значение, которое мне нужно проверить, это $ category_ID, а не $ category_parent, но это странно, потому что кажется, что это не работает. – Shinji3rd

0

Использование ниже код:

$data = unserialize('a:1:{s:8:"category";s:2:"23";}'); 
$category = $data['category']; 
if(is_numeric($category)){ 
    //Write code here if category is numeric (integer) 
}else{ 
    //Write code here if category is string (not numeric) 
} 
Смежные вопросы