Модераторы: skyboy, MoLeX, Aliance, ksnk

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Функция с необязательными параметрами, значения по умолчанию теряются 
V
    Опции темы
liliputochka
Дата 14.2.2010, 22:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 154
Регистрация: 16.3.2006
Где: Волгоград

Репутация: нет
Всего: нет



День добрый!
Я написала функцию, в которой некоторым параметрам задала значения по умолчанию. Когда я в функцию не передаю необязательные параметры и проверяю их значения в функции, то переменные приняли заданные по умолчанию мною значения. Но я вставляю эти переменные в 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, '', '', '', '', '', '')


Это сообщение отредактировал(а) liliputochka - 14.2.2010, 22:09
PM MAIL   Вверх
skyboy
Дата 14.2.2010, 22:32 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: 75
Всего: 260



Цитата(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-клиента(какая СУБД - только ты знаешь, вот и ищи под неё клиент).
какие типы у полей указанной таблицы - тоже никто не угадает.

PM MAIL   Вверх
liliputochka
Дата 14.2.2010, 23:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 154
Регистрация: 16.3.2006
Где: Волгоград

Репутация: нет
Всего: нет



Цитата(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
)

PM MAIL   Вверх
bars80080
Дата 14.2.2010, 23:35 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


прапор творюет
****
Награды: 1



Профиль
Группа: Завсегдатай
Сообщений: 12022
Регистрация: 5.12.2007
Где: Königsberg

Репутация: 71
Всего: 315



    name varchar(100) unique,

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


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

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

у меня, насколько помню, ругается на пустые строки, при вставке в числовые поля
PM MAIL WWW   Вверх
Fortop
Дата 14.2.2010, 23:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2200
Регистрация: 13.11.2007
Где: Донецк

Репутация: 20
Всего: 42



Цитата(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



--------------------
Мир это Я.
Живее всех живых.
PM MAIL   Вверх
skyboy
Дата 15.2.2010, 00:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: 75
Всего: 260



Цитата(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

это все сообщение или все же провинившаяся колонка называется вслух?
PM MAIL   Вверх
Fortop
Дата 15.2.2010, 00:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2200
Регистрация: 13.11.2007
Где: Донецк

Репутация: 20
Всего: 42



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

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

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



--------------------
Мир это Я.
Живее всех живых.
PM MAIL   Вверх
liliputochka
Дата 15.2.2010, 09:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 154
Регистрация: 16.3.2006
Где: Волгоград

Репутация: нет
Всего: нет



Цитата(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. И так далее.
PM MAIL   Вверх
awers
Дата 15.2.2010, 10:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник
Сообщений: 1465
Регистрация: 22.3.2006
Где: Россия, Таганрог

Репутация: 21
Всего: 31



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

ПыСы: Лилипуточка мужского рода - по меньшей мере странно
PM MAIL WWW ICQ Skype   Вверх
liliputochka
Дата 15.2.2010, 11:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 154
Регистрация: 16.3.2006
Где: Волгоград

Репутация: нет
Всего: нет



Цитата(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 Найти цитируемый пост)
ПыСы: Лилипуточка мужского рода - по меньшей мере странно 

Да! Мне тоже понравилось! Очень смешно! Не хочу хвалится, но может я дошла до такого уровня, что ко мне относятся не как "дурочка-девушка-программист", а как "свой парень"!?
PM MAIL   Вверх
MoLeX
Дата 15.2.2010, 11:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Местный пингвин
****


Профиль
Группа: Модератор
Сообщений: 4076
Регистрация: 17.5.2007

Репутация: 46
Всего: 140



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

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

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


--------------------
Amazing  smile 
PM MAIL WWW ICQ   Вверх
sTa1kEr
Дата 15.2.2010, 12:05 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


9/10 программиста
***


Профиль
Группа: Завсегдатай
Сообщений: 1553
Регистрация: 21.2.2007

Репутация: 56
Всего: 146



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 и пр. будут содержать значения по умолчанию.
PM MAIL   Вверх
awers
Дата 15.2.2010, 13:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник
Сообщений: 1465
Регистрация: 22.3.2006
Где: Россия, Таганрог

Репутация: 21
Всего: 31



liliputochka, госпади smile Пора мне уже выспаться smile 
PM MAIL WWW ICQ Skype   Вверх
liliputochka
Дата 15.2.2010, 13:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 154
Регистрация: 16.3.2006
Где: Волгоград

Репутация: нет
Всего: нет



Цитата(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 Найти цитируемый пост)
Пора мне уже выспаться

Спокойной ночи! Приятных вам снов!
PM MAIL   Вверх
Fortop
Дата 15.2.2010, 14:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2200
Регистрация: 13.11.2007
Где: Донецк

Репутация: 20
Всего: 42



Цитата(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;
    // дальше уже используете все элементы массива как угодно
}






--------------------
Мир это Я.
Живее всех живых.
PM MAIL   Вверх
sTa1kEr
Дата 15.2.2010, 14:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


9/10 программиста
***


Профиль
Группа: Завсегдатай
Сообщений: 1553
Регистрация: 21.2.2007

Репутация: 56
Всего: 146



Если вам нужно для всех этих параметров задать значение по умолчанию "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 Найти цитируемый пост)
Так или нет?

В этом случае параметры будут передаваться только если все шесть значений не равны нулю.
PM MAIL   Вверх
liliputochka
Дата 16.2.2010, 09:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 154
Регистрация: 16.3.2006
Где: Волгоград

Репутация: нет
Всего: нет



Спасибо всем!!! Вы мне очень помогли!
PM MAIL   Вверх
Страницы: (2) [Все] 1 2 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "PHP"
Aliance
IZ@TOP
skyboy
SamDark
MoLeX

Новичкам:

  • PHP редакторы собираются и обсуждаются здесь
  • Электронные книги по PHP, документацию можно найти здесь
  • Интерпретатор PHP, полную документацию можно скачать на PHP.NET

Важно:

  • Не брезгуйте пользоваться тегами [code=php]КОД[/code] для повышения читабельности текста/кода.
  • Перед созданием новой темы воспользуйтесь поиском и загляните в FAQ
  • Действия модераторов можно обсудить здесь

Внимание:

  • Темы "ищу скрипт", "подскажите скрипт" и т.п. будут переноситься в форум "Web-технологии"
  • Темы с именами: "Срочно", "помогите", "не знаю как делать" будут УДАЛЯТЬСЯ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, IZ@TOP, skyboy, SamDark, MoLeX, awers.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1097 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.