Как передать переменную в функцию?

344
18 сентября 2017, 04:59

Есть код:

$options = array(
   'user'    => 'test',
   'pass'    => '',
   'db'      => 'test'
);
function generate_link($file, $ip,$opts = $options) {
    $phrase = getRandomWord();
    $sql  = "INSERT INTO files SET ip=?s,file=?s,md5=?s";
    $db = new SafeMySQL($opts);
    $db->query($sql,$ip,$file,$phrase);
    return $phrase;
}

так вот переменная $options пишет unexpected..Как ее передать туда чтобы все работало?( это нужно для работы с объектом $db и подключения options из внешнего файла.. пробовал по разному и передавать сам объект и создавать его в другом файле.. не хочет он работать, только если создаю внутри функции работает

Answer 1

Внимание, правильный ответ.

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

function generate_link($db, $file, $ip) {
    $phrase = getRandomWord();
    $sql  = "INSERT INTO files SET ip=?s,file=?s,md5=?s";
    $db->query($sql,$ip,$file,$phrase);
    return $phrase;
}

а в скрипте пишем так

$options = [
   'user'    => 'test',
   'pass'    => '',
   'db'      => 'test'
];
$db = new SafeMySQL($options);
// в идеале все что выше, должно быть в отдельном файле 
// и подключаться через include
$file = 'что-то';
$ip = 'что-то';
echo generate_link($db, $file, $ip);
Answer 2

Передавайте массив третьим параметром:

<?php
$file = 'что-то';
$ip = 'что-то';
$options = [
   'user'    => 'test',
   'pass'    => '',
   'db'      => 'test'
];
echo generate_link($file, $ip, $options);

function generate_link($file, $ip, $options) {
    $phrase = getRandomWord();
    $sql  = "INSERT INTO files SET ip=?s,file=?s,md5=?s";
    $db = new SafeMySQL($options);
    $db->query($sql, $ip, $file, $phrase);
    return $phrase;
}
Answer 3

Если нужен вариант типа "если нет кастомных опций, тогда используем опции по умолчанию", то я бы сделал так:

function generate_link($file, $ip,$opts = Null) {
if(empty($opts)) {
  //устанавливаем настройки по умолчанию. Можно взять с какой-то переменной или установить так: 
 $opts = [
   'user'    => 'test',
   'pass'    => '',
   'db'      => 'test'
  ];
}
 // тело функции
}

Варианты использования:

//с настройками по умолчанию:
   echo generate_link($file, $ip);
// с кастомными настройками:
         $options = [
           'user'    => 'test2',
           'pass'    => '',
           'db'      => 'test'
          ];
    echo generate_link($file, $ip, $options);
READ ALSO
PHP помогите с регуляркой

PHP помогите с регуляркой

Что нужно дописать что бы выражение пропускало только a-z в нижнем регистре

200
include file и jQuery load() того же файла

include file и jQuery load() того же файла

Имеется файл, который подключается через include к главной странице (так он работает)Так-же этот файл взываю аяксом и тут, через if определяю если...

174