反序列化wordpress数据库查询数据
Unserialize wordpress database to query data
我有一个 mysql 数据库,看起来像这样
+----+----------+---------+----------------------------------+---------------------+
| id | field_id | user_id | value | last_updated |
+----+----------+---------+----------------------------------+---------------------+
| 1 | 1 | 1 | admin | yyyy-mm-dd hh:mm:ss |
| 3 | 5 | 1 | a:1:{i:0;s:2:"18";} | yyyy-mm-dd hh:mm:ss |
| 4 | 1 | 2 | testuser1 | yyyy-mm-dd hh:mm:ss |
| 5 | 5 | 2 | a:2:{i:0;s:2:"19";i:1;s:2:"18";} | yyyy-mm-dd hh:mm:ss |
+----+----------+---------+----------------------------------+---------------------+
我知道普通的 sql 查询不适合,所以我需要将所有数据拉入 php 然后对其进行排序。
我想要的是得到任何有数字的 user_id,比如 field_id
中的“19” 5。在那个例子中,数组应该是“2”。或者我可以在 field_id
5 中搜索“18”,数组将 return“1,2”。
要获取数据库,我使用以下
<?php
global $wpdb;
$table_name = $wpdb->prefix . "bp_xprofile_data";
$retrieve_data = $wpdb->get_results( "SELECT * FROM $table_name" );
$strDB = maybe_unserialize( $retrieve_data);
echo print_r($strDB, true);
?>
哪个 returns:
Array ( [0] => stdClass Object ( [id] => 1 [field_id] => 1 [user_id] => 1 [value] => admin [last_updated] => 2017-09-21 12:38:20 ) [1] => stdClass Object ( [id] => 3 [field_id] => 5 [user_id] => 1 [value] => a:1:{i:0;s:2:"18";} [last_updated] => 2017-09-21 12:38:20 ) [2] => stdClass Object ( [id] => 4 [field_id] => 1 [user_id] => 2 [value] => testuser1 [last_updated] => 2017-09-23 01:43:50 ) [3] => stdClass Object ( [id] => 5 [field_id] => 5 [user_id] => 2 [value] => a:2:{i:0;s:2:"19";i:1;s:2:"18";} [last_updated] => 2017-09-23 01:43:50 ) )
我不知道如何整理这些数据。我试图找到字符串的各个部分,但这不起作用。
嗯,第一条规则——你不应该这样做。但如果有充分的理由,请考虑将此类查询用于 在基于索引的数组中搜索
SELECT * FROM $table_name WHERE value REGEXP '.*;s:[0-9]+:"19".*'
在这里,我们像您一样在 value 列上搜索值 "19"在带有正则表达式的示例中。
问候。
您应该能够在 'value' 字段上使用 LIKE 比较,例如
SELECT * FROM $table_name AND value LIKE '%9%'
搜索数字的困难在于 LIKE 也会 return 部分匹配,因此查询 9 也会 return 19、91、192 等
但是,根据序列化字符串中被双引号包围的值,您应该能够通过在搜索字符串中包含双引号来搜索准确的值,例如"9"
.
将其添加到您问题的代码中,我们得到:
global $wpdb;
$num_to_find = 19; /* or change to whatever number you need */
$field_id_to_check = 5; /* or change to whatever number you need */
$table_name = $wpdb->prefix . "bp_xprofile_data";
$user_ids = $wpdb->get_results(
$wpdb->prepare(
"SELECT user_id FROM $table_name
WHERE field_id = %d AND value LIKE '%%\"%d\"%%'",
$field_id_to_check, /*this param replaces the 1st %d in the query */
$num_to_find /*this param replaces the 2nd %d in the query */
)
);
print_r($user_ids);
注意:因为查询包含一个变量而且我不知道它来自哪里,所以我使用 $wpdb->prepare 来清理变量。
未经测试,但我相信它应该有效!
我有一个 mysql 数据库,看起来像这样
+----+----------+---------+----------------------------------+---------------------+
| id | field_id | user_id | value | last_updated |
+----+----------+---------+----------------------------------+---------------------+
| 1 | 1 | 1 | admin | yyyy-mm-dd hh:mm:ss |
| 3 | 5 | 1 | a:1:{i:0;s:2:"18";} | yyyy-mm-dd hh:mm:ss |
| 4 | 1 | 2 | testuser1 | yyyy-mm-dd hh:mm:ss |
| 5 | 5 | 2 | a:2:{i:0;s:2:"19";i:1;s:2:"18";} | yyyy-mm-dd hh:mm:ss |
+----+----------+---------+----------------------------------+---------------------+
我知道普通的 sql 查询不适合,所以我需要将所有数据拉入 php 然后对其进行排序。
我想要的是得到任何有数字的 user_id,比如 field_id
中的“19” 5。在那个例子中,数组应该是“2”。或者我可以在 field_id
5 中搜索“18”,数组将 return“1,2”。
要获取数据库,我使用以下
<?php
global $wpdb;
$table_name = $wpdb->prefix . "bp_xprofile_data";
$retrieve_data = $wpdb->get_results( "SELECT * FROM $table_name" );
$strDB = maybe_unserialize( $retrieve_data);
echo print_r($strDB, true);
?>
哪个 returns:
Array ( [0] => stdClass Object ( [id] => 1 [field_id] => 1 [user_id] => 1 [value] => admin [last_updated] => 2017-09-21 12:38:20 ) [1] => stdClass Object ( [id] => 3 [field_id] => 5 [user_id] => 1 [value] => a:1:{i:0;s:2:"18";} [last_updated] => 2017-09-21 12:38:20 ) [2] => stdClass Object ( [id] => 4 [field_id] => 1 [user_id] => 2 [value] => testuser1 [last_updated] => 2017-09-23 01:43:50 ) [3] => stdClass Object ( [id] => 5 [field_id] => 5 [user_id] => 2 [value] => a:2:{i:0;s:2:"19";i:1;s:2:"18";} [last_updated] => 2017-09-23 01:43:50 ) )
我不知道如何整理这些数据。我试图找到字符串的各个部分,但这不起作用。
嗯,第一条规则——你不应该这样做。但如果有充分的理由,请考虑将此类查询用于 在基于索引的数组中搜索
SELECT * FROM $table_name WHERE value REGEXP '.*;s:[0-9]+:"19".*'
在这里,我们像您一样在 value 列上搜索值 "19"在带有正则表达式的示例中。 问候。
您应该能够在 'value' 字段上使用 LIKE 比较,例如
SELECT * FROM $table_name AND value LIKE '%9%'
搜索数字的困难在于 LIKE 也会 return 部分匹配,因此查询 9 也会 return 19、91、192 等
但是,根据序列化字符串中被双引号包围的值,您应该能够通过在搜索字符串中包含双引号来搜索准确的值,例如"9"
.
将其添加到您问题的代码中,我们得到:
global $wpdb;
$num_to_find = 19; /* or change to whatever number you need */
$field_id_to_check = 5; /* or change to whatever number you need */
$table_name = $wpdb->prefix . "bp_xprofile_data";
$user_ids = $wpdb->get_results(
$wpdb->prepare(
"SELECT user_id FROM $table_name
WHERE field_id = %d AND value LIKE '%%\"%d\"%%'",
$field_id_to_check, /*this param replaces the 1st %d in the query */
$num_to_find /*this param replaces the 2nd %d in the query */
)
);
print_r($user_ids);
注意:因为查询包含一个变量而且我不知道它来自哪里,所以我使用 $wpdb->prepare 来清理变量。
未经测试,但我相信它应该有效!