Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Общие вопросы > Функция с необязательными параметрами


Автор: liliputochka 14.2.2010, 22:09
День добрый!
Я написала функцию, в которой некоторым параметрам задала значения по умолчанию. Когда я в функцию не передаю необязательные параметры и проверяю их значения в функции, то переменные приняли заданные по умолчанию мною значения. Но я вставляю эти переменные в sql-выражение, а значения не вставляются! 
Вы не знаете почему?
Код

public function InsertIntoTests($connect, $NewTest, $TimeForTest, $version, $ID_Predmet, $ID_user,
 $three_min="0", $three_max="0", $four_min="0", $four_max="0", $five_min="0", $five_max="0"){

    if($connect != 0){
        $time = $this->ConvertTime($TimeForTest);
        if($three_min == 0) echo "ok";
        echo $three_min.":".$three_max.":".$four_min.":".$four_max.":".$five_min.":".$five_max;
        $three_min = 0;
        $query0 = "insert into ".$this->Table3." values(NULL, '".$NewTest."', '".$time."', ".$version.", ".$ID_Predmet.", ".$ID_user.", ".$three_min.", '".$three_max."', '".$four_min."', '".$four_max."', '".$five_min."', '".$five_max."')"; 
        echo $query0;
        mysql_query($query0, $connect) or die(mysql_error());
        
        $query1 = "select last_insert_id()";
        if($res1 = mysql_query($query1, $connect)){
            $z1 = mysql_fetch_array($res1);
        }
        $ID_Test = $z1['last_insert_id()'];
                
                        return $ID_Test;
    }
    return 0;
}

Выдает ошибку:
Код

Out of range value adjusted for column

При этом:
1)
Код

if($three_min == 0) echo "ok";

Пишет:
Код

ok

2)
Код

echo $three_min.":".$three_max.":".$four_min.":".$four_max.":".$five_min.":".$five_max;

Пишет:
Код

:::::

3)
Код

$three_min = 0;

Перестает жаловаться на данную переменную и переходит к следующей переменной.
4)
Код

echo $query0;

Пишет:
Код

insert into tests values(NULL, 'JUM', '0:20:00', 1, 3, 3, '', '', '', '', '', '')

Автор: skyboy 14.2.2010, 22:32
Цитата(liliputochka @  14.2.2010,  21:09 Найти цитируемый пост)
Но я вставляю эти переменные в sql-выражение, а значения не вставляются! 

потому что происходит ошибка:
Цитата(liliputochka @  14.2.2010,  21:09 Найти цитируемый пост)
Out of range value adjusted for column

попробуй выполнить запрос 
Цитата(liliputochka @  14.2.2010,  21:09 Найти цитируемый пост)
insert into tests values(NULL, 'JUM', '0:20:00', 1, 3, 3, '', '', '', '', '', '')

из консольного или web-клиента(какая СУБД - только ты знаешь, вот и ищи под неё клиент).
какие типы у полей указанной таблицы - тоже никто не угадает.

Автор: liliputochka 14.2.2010, 23:23
Цитата(skyboy @  14.2.2010,  22:32 Найти цитируемый пост)
попробуй выполнить запрос 
Цитата(liliputochka @  14.2.2010,  21:09 Найти цитируемый пост)
insert into tests values(NULL, 'JUM', '0:20:00', 1, 3, 3, '', '', '', '', '', '')

Выдается ошибка
Цитата

Out of range value adjusted for column


Цитата(skyboy @  14.2.2010,  22:32 Найти цитируемый пост)
какая СУБД - только ты знаешь

MySQL 5.0


Цитата(skyboy @  14.2.2010,  22:32 Найти цитируемый пост)
какие типы у полей указанной таблицы - тоже никто не угадает.

Код

create table IF NOT EXISTS tests(
    id int PRIMARY KEY auto_increment,
    name varchar(100) unique,
    TimeForTest TIME,
    Version int default 1 comment '1 - permitted, 0 - prohibited',
    id_predmet int,
    id_user int    comment 'who add test',
    3_min int,
    3_max int,
    4_min int,
    4_max int,
    5_min int,
    5_max int
)

Автор: bars80080 14.2.2010, 23:35
    name varchar(100) unique,

я так понимаю, должна соблюдаться уникальность значения в поле. ты уверен, что у тебя уже нет строк с name='JUM'?


    3_min int,
    3_max int,
    4_min int,
    4_max int,
    5_min int,
    5_max int

'', '', '', '', '', '')

у меня, насколько помню, ругается на пустые строки, при вставке в числовые поля

Автор: Fortop 14.2.2010, 23:58
Цитата(liliputochka @  14.2.2010,  21:09 Найти цитируемый пост)
2)
код PHP
echo $three_min.":".$three_max.":".$four_min.":".$four_max.":".$five_min.":".$five_max;
Пишет:
:::::

Как вызывается функция?

Потому что
Код

function InsertIntoTests($three_min="0", $three_max="0", $four_min="0", $four_max="0", $five_min="0", $five_max="0")
{
echo $three_min.":".$three_max.":".$four_min.":".$four_max.":".$five_min.":".$five_max;
};

Insertintotests();

Дает
Код

0:0:0:0:0:0

Автор: skyboy 15.2.2010, 00:01
Цитата(bars80080 @  14.2.2010,  22:35 Найти цитируемый пост)
я так понимаю, должна соблюдаться уникальность значения в поле

ну, обычно в таких ситуациях сообщение об ошибке "Duplicate entry for key"
у меня вставка произошла. phpmyadmin + mysql 55.1.37
хотя ожидал подвоха и от "0:20:00", и от пустых строк для полей типа int
Цитата(liliputochka @  14.2.2010,  22:23 Найти цитируемый пост)
Out of range value adjusted for column

это все сообщение или все же провинившаяся колонка называется вслух?

Автор: Fortop 15.2.2010, 00:07
Цитата(skyboy @  14.2.2010,  23:01 Найти цитируемый пост)
mysql 55.1.37

В 5.1.41 ругается на пустые строки. Впрочем с указанием имени конкретного столбца.

Incorrect integer value: '' for column '4_max' at row 1

Автор: liliputochka 15.2.2010, 09:37
Цитата(Fortop @  14.2.2010,  23:58 Найти цитируемый пост)
Как вызывается функция?

Данная функция написана в классе. Я создаю объект класса 
Код

$db = new DataBase();

Затем вот таким образом вызываю эту функцию
Код

$ID_Test = $db->InsertIntoTests($ID, $test, $TimeForTest, $version, $id_predmet, $id_user, $three_min, $three_max, $four_min, $four_max, $five_min, $five_max);

соответствующие параметры $three_min, $three_max, $four_min, $four_max, $five_min, $five_max передаются через заполненную форму.

Цитата(bars80080 @  14.2.2010,  23:35 Найти цитируемый пост)
ты уверен, что у тебя уже нет строк с name='JUM'?

Уверен!

Цитата(skyboy @  15.2.2010,  00:01 Найти цитируемый пост)
это все сообщение или все же провинившаяся колонка называется вслух? 

нет, это не все сообщение. Сначала ругается на колонку 3_min, после этого 
Цитата

$three_min = 0;

Начинает ругаться на колонку 3_max. И так далее.

Автор: awers 15.2.2010, 10:54
liliputochka, ты лучше сделай show create table *table_name* со своей таблицей и покажи сюда. Причём тут кстати пхп?

ПыСы: Лилипуточка мужского рода - по меньшей мере странно

Автор: liliputochka 15.2.2010, 11:21
Цитата(awers @  15.2.2010,  10:54 Найти цитируемый пост)
show create table *table_name* со своей таблицей и покажи сюда.

Я же уже выложила структуру таблицы?! Тот sql-запрос, что, пролистав наверх, вы увидите и создал таблицу, в которую заносятся данные.
Цитата(awers @  15.2.2010,  10:54 Найти цитируемый пост)
Причём тут кстати пхп?

Ну так не работает именно php-код, там где по всем учебникам переменным должны присваиваться значения. Вроде присваиваются, но при подстановке этих значений в необходимые мне места - значения как бы испаряются и переменные оказываются вовсе не определенные!

Цитата(awers @  15.2.2010,  10:54 Найти цитируемый пост)
ПыСы: Лилипуточка мужского рода - по меньшей мере странно 

Да! Мне тоже понравилось! Очень смешно! Не хочу хвалится, но может я дошла до такого уровня, что ко мне относятся не как "дурочка-девушка-программист", а как "свой парень"!?

Автор: MoLeX 15.2.2010, 11:38
Цитата(liliputochka @  15.2.2010,  11:21 Найти цитируемый пост)

Да! Мне тоже понравилось! Очень смешно! Не хочу хвалится, но может я дошла до такого уровня, что ко мне относятся не как "дурочка-девушка-программист", а как "свой парень"!? 

Тсссс, бережем нервы. Не кто не кого не хотел обидеть!

Автор: sTa1kEr 15.2.2010, 12:05
liliputochka, нужно проверять данные перед тем, как добавлять их в запрос. Хотя бы на соответствие типу или явно приводить их нужному типу http://php.net/types.type-juggling
Код

        $query0 = "insert into ".$this->Table3." values(
            NULL, 
            '".mysql_real_escape_string($NewTest)."',
            '".mysql_real_escape_string($time)."',
            ".(integer)$version.",
            ".(integer)$ID_Predmet.",
            ".(integer)$ID_user.",
            ".(integer)$three_min.",
            ".(integer)$three_max.",
            ".(integer)$four_min.",
            ".(integer)$four_max.",
            ".(integer)$five_min.",
            ".(integer)$five_max.")"; 


Добавлено через 4 минуты и 45 секунд
Цитата(liliputochka @  14.2.2010,  23:09 Найти цитируемый пост)
Когда я в функцию не передаю необязательные параметры и проверяю их значения в функции, то переменные приняли заданные по умолчанию мною значения. Но я вставляю эти переменные в sql-выражение, а значения не вставляются! 

А для того, что бы использовались значения по умолчанию, нужно опустить соответствующие параметры при вызове функции. Т.е. при вызове
Код

$ID_Test = $db->InsertIntoTests($ID, $test, $TimeForTest, $version, $id_predmet, $id_user);

Параметры $three_min, $three_max и пр. будут содержать значения по умолчанию.

Автор: awers 15.2.2010, 13:13
liliputochka, госпади smile Пора мне уже выспаться smile 

Автор: liliputochka 15.2.2010, 13:38
Цитата(sTa1kEr @  15.2.2010,  12:05 Найти цитируемый пост)
А для того, что бы использовались значения по умолчанию, нужно опустить соответствующие параметры при вызове функции

Большое спасибо! Только у меня дело в том, что эти параметры иногда могут принимать какие-то значение, а иногда могут быть пустыми. Мне для подобной реализации надо делать так:
Код

if($three_min != 0 && $three_max != 0 && $four_min != 0 && $four_max != 0 && $five_min != 0 && $five_max != 0){
$ID_Test = $db->InsertIntoTests($ID, $test, $TimeForTest, $version, $id_predmet, $id_user, $three_min, $three_max, $four_min, $four_max, $five_min, $five_max);
}
else{
$ID_Test = $db->InsertIntoTests($ID, $test, $TimeForTest, $version, $id_predmet, $id_user);
}

Так или нет?
Цитата(awers @  15.2.2010,  13:13 Найти цитируемый пост)
Пора мне уже выспаться

Спокойной ночи! Приятных вам снов!

Автор: Fortop 15.2.2010, 14:32
Цитата(liliputochka @  15.2.2010,  12:38 Найти цитируемый пост)
Только у меня дело в том, что эти параметры иногда могут принимать какие-то значение, а иногда могут быть пустыми. Мне для подобной реализации надо делать так:

Т.е. даже вы сами не знаете, когда у вас есть параметры перед вызовом функции?

Тогда рекомендую сделать так
Код

$params = array();
//Там где вы принимаете параметр - заносите его в массив, примерно таким образом
if (isset($_POST['myparam1'])) {
    $params['myparam1'] = (int)$_POST['myparam1']; 
}
// И вызывать так
myfunc($requiredParam1,$requiredParam2, $params)

//Ну и в функции
myfunc($requiredParam1,$requiredParam2, array $params) {
    $defaultParams = array('myparam1' => 0, 'myparam2' => 0, ... ,'myparamN' => 0);
    $params += $defaultParams;
    // дальше уже используете все элементы массива как угодно
}




Автор: sTa1kEr 15.2.2010, 14:53
Если вам нужно для всех этих параметров задать значение по умолчанию "0", то можно оставить вызов функции как есть со всеми параметрами. Достаточно будет приводить значения этих параметров к integer, как я описал выше.
Если значения по умолчанию могут быть произвольными, то можно сделать сл. образом:
Код

public function InsertIntoTests($connect, $NewTest, $TimeForTest, $version, $ID_Predmet, $ID_user,
    $three_min = null, $three_max = null, $four_min = null, $four_max = null, $five_min = null, $five_max = null) {

    if ($three_min === null) {
        $three_min = 1; // Значение по умолчанию
    }

    if ($three_max  === null) {
        $three_max  = 100; // Значение по умолчанию
    }

    // и т.д 
}


Цитата(liliputochka @  15.2.2010,  14:38 Найти цитируемый пост)
Так или нет?

В этом случае параметры будут передаваться только если все шесть значений не равны нулю.

Автор: liliputochka 16.2.2010, 09:20
Спасибо всем!!! Вы мне очень помогли!

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)