|
| Дата |
|
USD/RUB | 93.4409 | BTC/USD | 64484.5002 |
|
|
|
Скрипты, программы и технические решения Обсуждаем скрипты, программы и новые технологии. |
24.10.2012, 10:25
|
#1
|
__٩(̾●̮̮̃̾•̃̾)۶__
Регистрация: 30.05.2010
Сообщений: 259
Бабло: $97241
|
help c php
всем привет
сижу уже час туплю как исправить ошибку загуглился до немогу:
Код:
Warning: mb_strlen() expects parameter 1 to be string, array given in
кусок кода :
PHP код:
$last_id = 0;
$bad_ids = array();
while(1) {
$list = bonus_list(false, " AND id>$last_id ORDER BY id ASC LIMIT 100" );
if (empty($list))
exit(0);
foreach($list as $bonus ) {
$last_id=$bonus['id'];
echo $last_id.' mem:'.(intval(memory_get_usage()/1024/1024))."\n";
$bonus_str = bonus_cache_serialize_get($bonus['id']);
if ( mb_strlen($bonus_str) > 1024*1024*4 ) {
$bad_ids[] = $bonus['id'];
}
else {
bonus_set_for_cache_update($bonus_id);
}
}
}
if ( $bad_ids ) {
echo "Bad bonus ids:".var_export($bad_ids)."\n";
}
echo "Finish\n";
ошибка в коде судя по логам тут :
PHP код:
if ( mb_strlen($bonus_str) > 1024*1024*4 ) {
может костыль какой можно придумать или еще что нибуть
зы данные в базе в utf8
|
|
|
24.10.2012, 10:58
|
#2
|
sysadm
Регистрация: 28.12.2007
Сообщений: 588
Бабло: $101521
|
после $bonus_str = bonus_cache_serialize_get($bonus['id']);
пропиши print_r($bonus_str); - походу у тебя там массив(судя из ошибки) возввращает, а не строку.
bonus_cache_serialize_get -- что делает эта функция?
|
|
|
24.10.2012, 16:38
|
#3
|
Member
Регистрация: 16.01.2008
Сообщений: 86
Бабло: $11570
|
Текст ошибки - явно показывает в чем косяк. bonus_str - это массив. А нужна - строка.
И если данные в утф8, то это лучше явно указать в mb_strlen. Иначе значения могут быть не правильные.
т.е. mb_strlen($bonus_str,'UTF-8')
Ибо, по умолчанию, если не установлено mb_internal_encoding("UTF-8") - то, например mb_strlen('Хуй')=6 (в случае УТФ8), и mb_strlen('Хуй','UTF-8')=3.
|
|
|
24.10.2012, 18:50
|
#4
|
__٩(̾●̮̮̃̾•̃̾)۶__
Регистрация: 30.05.2010
Сообщений: 259
Бабло: $97241
ТС -->
|
ТС
Цитата:
Сообщение от pesdexx
bonus_cache_serialize_get -- что делает эта функция?
|
Сериальзует данные из нескольких таблиц в одну записть - в результате получается массив , чтобы хранить в базе всю инфу о бонусе в отдельной таблице, в примерно таком виде:
Цитата:
bonus = array(id=>5, ...., 'bonus_item_list' => array(), 'embedded_bonuses' => array of `bonus` )
'bonus_item_list' = array('id',...., 'restriction_list' => array of 'restriction' );
'restriction' = array('id', ...., 'restriction_item_list' => array of 'restriction_item')
'restriction_item' = array(id, ....)
|
при добовлении print_r($bonus_str); выдает результат такого вида :
Цитата:
[15] => Array
(
[id] => 27024
[bonus_id] => 7
[type] => FBFEED
[field] => 6
[value1] =>
[value2] =>
[flags] => 16
[gender] => 0
[kind] => 0
[drop_weight] => 0
[per_unit] => 0
[per_value] => 0
[restriction_list] => Array
(
)
|
Цитата:
mb_strlen($bonus_str,'UTF-8')
|
делал непомогло
|
|
|
24.10.2012, 19:04
|
#5
|
конверчу-хуеверчу
Регистрация: 16.09.2009
Сообщений: 605
Бабло: $103180
|
в mb_strlen передается массив, а она считает только строки. Если нужно узнать размер переменной можно взять разницу get_memory_usage до и после присваивания.
Да и судя по коду его благословил сам Кришна
|
|
|
25.10.2012, 02:24
|
#6
|
Member
Регистрация: 16.01.2008
Сообщений: 86
Бабло: $11570
|
Цитата:
Сообщение от the4gamblers
делал непомогло
|
Ясен пень не поможет. Потому что надо передавать строку, а не массив. )
тут уже в каждом коменте указано, что надо передавать строку.
mb_strlen(serialize($bonus_str),'UTF-8'); - а вот так сработает, и будет еще более по кришнаитски.
Но это будет все равно не то, что ты хочешь сделать. Потому, что в коде - действительно без кришны не обошлось.
|
|
|
25.10.2012, 20:02
|
#7
|
__٩(̾●̮̮̃̾•̃̾)۶__
Регистрация: 30.05.2010
Сообщений: 259
Бабло: $97241
ТС -->
|
ТС
Цитата:
Сообщение от Gyrus
Ясен пень не поможет. Потому что надо передавать строку, а не массив. )
тут уже в каждом коменте указано, что надо передавать строку.
mb_strlen(serialize($bonus_str),'UTF-8'); - а вот так сработает, и будет еще более по кришнаитски.
Но это будет все равно не то, что ты хочешь сделать. Потому, что в коде - действительно без кришны не обошлось.
|
проблемму решил, решение простое просто забил болт
|
|
|
25.10.2012, 20:23
|
#8
|
Senior Member
Регистрация: 31.03.2011
Сообщений: 3,360
Бабло: $669045
|
Цитата:
Сообщение от the4gamblers
проблемму решил, решение простое просто забил болт
|
Не, ну серьезно, если ты сам это писал - то наверно должен понимать что массив - совокупность значений. Функция которая выдавала тебе еррор может обработать только одно. Значит выбери из массива то что хочешь обработать и передай в эту функцию.
я понимаю что в 3 ночи не до написания сплоитов, но можно и утром написать же
|
|
|
|