• PHP Жуйк, я не программист вообще, но мне кое-что приходиться делать и у меня возникают тупые сложности и тупые вопросы. В общем, мне нужна помощь. Есть скриптик, который добавляет табличку в БД, и он мне при попытке выполнения говорит Fatal error: Function name must be a string in install.php on line 4.
    Вот скрипт:
    <?php
    global $smcFunc;

    $smcFunc ['db_create_table'] ('bookmarks',
    array(
    array(
    'name' => 'id_member',
    'type' => 'mediumint',
    'size' => 8,
    ),
    array(
    'name' => 'id_topic',
    'type' => 'mediumint',
    'size' => 8,
    ),
    ),
    array(
    array(
    'name' => 'bookmark',
    'type' => 'unique',
    'columns' => array('id_member', 'id_topic'),
    ),
    ),
    array(),
    'ignore');
    ?>
    А я просто не могу понять, что ему не нравится и что ему надо? :(

Replies (14)

  • @Divna, скобки все на месте?
  • @Divna, вместо $smcFunc ['db_create_table']...
    попробуй
    call_user_func_array($smcFunc['db_create_table'], array('bookmarks',
    array(
    array(
    'name' => 'id_member',
    'type' => 'mediumint',
    'size' => 8,
    ),
    array(
    'name' => 'id_topic',
    'type' => 'mediumint',
    'size' => 8,
    ),
    ),
    array(
    array(
    'name' => 'bookmark',
    'type' => 'unique',
    'columns' => array('id_member', 'id_topic'),
    ),
    ),
    array(),
    'ignore'));
  • @Divna, проблема в том, что имя функции — это строка. Правильно сначала проверить есть ли эта строка:
    if ( function_exists($smcFunc ['db_create_table']) ) {
    $smcFunc ['db_create_table'] ( ... )
    } else {
    #my_error_handler#
    print 'Function ' . $smcFunc ['db_create_table']. ' doesn\'t exists.';
    }
  • @Divna, вот рабочий вариант:
    <?php
    global $smcFunc;
    function test(){print'a';}
    $member = array(
    array(
    <------>'name' => 'id_member',
    <------>'type' => 'mediumint',
    <------>'size' => 8,
    ),
    array(
    <------>'name' => 'id_topic',
    <------>'type' => 'mediumint',
    <------>'size' => 8,
    ),
    );
    $bookmark = array(
    array(
    <------>'name' => 'bookmark',
    <------>'type' => 'unique',
    <------>'columns' => array('id_member', 'id_topic'),
    <------>),
    );
    $smcFunc['db_create_table'] = 'test';
    $function = $smcFunc['db_create_table'];

    if ( function_exists($function) ) {
    $function('bookmarks', $member, $bookmark, array(), 'ignore');
    } else {
    echo 'ERRORRRR';
    }
  • @Divna, @mc Спасибо, сейчас попробую! Все попытки до сих пор по всем советам пока ни к чему не привели)
  • @Divna, @Divna global — это круто, но скорее всего функции нет, т.к. чтонить не заинклудили.
  • @Divna, @mc Вооот, теперь он ни на что не ругается :) Спасибо! Табличку в базе правда тоже не создает, пойду разбираться дальше...
  • @Divna, @Divna print '>>> ' . $smcFunc['db_create_table'] . '<<<';
  • @Divna, @mc лучше
    print_r($smcFunc);
  • @Divna, @sign не лучше. может оказаться большим мосивом и загрузкой на много страниц.
  • @Divna, @mc волков бояться — в лес не ходить)
  • @Divna, @sign тогда сразу print_r($GLOBALS), фигли... (-:
  • @Divna, @mc убедил ; )
  • @Divna, А Вам не кажется, что это — жестко, выполнять функцию, имя которой берется из глобальных переменных? ) по существу — {$smcFunc ['db_create_table'] }('bookmarks',
    array( .... и т.д.