Извлечение массива в динамические переменные

Я пытаюсь быть ленивым (или умным): у меня есть 7 флажков, которые соотносятся с 7 столбцами в таблице MySQL.

Флажки размещены в массиве:

$can = $_POST['can'];

Я создал следующий цикл для дампа переменных для вставки MySQL:

for($i=1;$i<8;$i++){
    if($can[$i] == "on"){
        ${"jto_can".$i} = 'Y';
    }
    else{
        ${"jto_can".$i} = 'N';
    }
}
print_r($jto_can1.$jto_can2.$jto_can3.$jto_can4.$jto_can5.$jto_can6.$jto_can7);

Это правильно выводит:

YYNYYYY

Однако, когда я пытаюсь использовать эти переменные в моем обновлении MySQL, он не принимает изменения.

mysqli_query($db, "UPDATE jto SET jto_can1 = '$jto_can1', jto_can2 = '$jto_can2', jto_can3 = '$jto_can3', jto_can4 = '$jto_can4', jto_can5 = '$jto_can5', jto_can6 = '$jto_can6', jto_can7 = '$jto_can7' WHERE jto_id = '$id'")or die(mysqli_error($db));

Может ли кто-нибудь объяснить, почему print_r отображает переменные, а MySQL - нет?

4
nl ja de
Придерживайтесь массива, нет смысла или выгоды при создании всех этих переменных.
добавлено автор nickb, источник
Кроме того, вам не хватает места между «WHERE» здесь: jto_can7 = '$ jto_can7'WHERE jto_id =' $ id '
добавлено автор nickb, источник
Каким типом данных являются столбцы в вашей таблице?
добавлено автор hank, источник
Создавая переменные dynamic ... вы делаете свой оператор MySQL не настолько динамичным , так как вам нужно будет изменить максимальное количество в цикле for и добавить или удалить vars из вашего mysql, если поля меняются. Просто используйте массив.
добавлено автор Tim Joyce, источник
что сообщение об ошибке ...
добавлено автор Vineet1982, источник
Пожалуйста, эхо запроса в качестве эха "UPDATE jto SET jto_can1 = '$ jto_can1', jto_can2 ......." знать ошибку
добавлено автор Vineet1982, источник
@thebarless вы можете эхо запроса, чтобы знать, что печатает ...
добавлено автор Vineet1982, источник
Как мне следует загружать массив в MySQL?
добавлено автор thebarless, источник
@hank, это столбцы ENUM - для Y и N
добавлено автор thebarless, источник
@ Vineet1982, он не выводит ошибку - вот что заставило меня поверить, что это не проблема SQL сама по себе.
добавлено автор thebarless, источник
@ Vineet1982 - ну, это решило. Я потерял свою идентификационную переменную вдоль строк. Благодарю.
добавлено автор thebarless, источник
Вам будет лучше делать заявление о обновлении в цикле, которое у вас есть, и добавлять значения до конца. Имейте массив имен столбцов, а затем эти значения и оттуда.
добавлено автор Gyhth, источник

2 ответы

Придерживайтесь массива и динамически формируйте запрос:

$sql = 'UPDATE jto SET ';

$cols = array();
foreach( range( 1, 7) as $i) {
    $value = $_POST['can'][$i] == 'on' ? 'Y' : 'N';//Error check here, $_POST['can'] might not exist or be an array
    $cols[] = 'jto_can' . $i . ' = "' . $value . '"'; 
}

$sql .= implode( ', ', $cols) . ' WHERE jto_id = "' . $id . '"';

Теперь сделайте var_dump ($ sql); , чтобы увидеть новый оператор SQL.

2
добавлено

это не проблема mysql. MySQL будет видеть только то, что вы положили в эту строку. например выгрузите строку запроса до того, как вы выполните mysql_query. Я предполагаю, что вы выполняете этот запрос в другом месте и сталкиваетесь с проблемами определения области. И да, это лениво. Нет, это не «умный». вы просто делаете БОЛЬШУЮ работу для себя. Что не так с

INSERT ... VALUES jto_can1=$can[0], jto_can2=$can[1], etc...
1
добавлено
Единственная трудность, с которой я сталкиваюсь в этом методе, заключается в том, что я не вижу, как контролировать, что $ can [0] get имеет значение «N», когда флажок не установлен. Массив будет пропускать только проверенные (если я не пропущу что-то).
добавлено автор thebarless, источник
phpGeeks
phpGeeks
3 620 участник(ов)

Best PHP chat Еще: @dbGeeks - базы данных @phpGeeksJunior - новичкам @moscowProgers - IT Москва @ebanoePhp - весёлый канал о PHP @laravel_pro - Laravel @jobGeeks - вакансии @jsChat - JS Правила: https://t.me/phpGeeks/764859 ДР - 28.03.2016

DBA - русскоговорящее сообщество
DBA - русскоговорящее сообщество
1 345 участник(ов)

Общаемся и обсуждаем темы, посвященные DBA, PostgreSQL, Redis, MongoDB, MySQL, neo4j, riak и т.д. См. также: @devops_ru, @kubernetes_ru, @docker_ru, @nodejs_ru Рекомендуем сразу отключить уведомления, чтобы пребывание здесь было полезным и комфортным.

PHP
PHP
1 309 участник(ов)

Группа про современный PHP. Обсуждаем ООП, TDD, BDD, DDD, SOLID, GRASP и прочие крутые базворды Для ознакомления: https://gist.github.com/mkusher/711bd46f0b62fbae851182e6fb3b1839 Группа PHP для новичков @phpGeeksJunior Вакансии: https://t.me/fordev

PHP — вакансии, поиск работы и аналитика
PHP — вакансии, поиск работы и аналитика
1 251 участник(ов)

Публикуем вакансии и запросы на поиск работы по направлению PHP, Laravel, Symfony, Yii и т.д. Здесь всё: full-time, part-time, remote и разовые подработки. См. также: @qa_jobs, @devops_jobs, @javascript_jobs, @nodejs_jobs, @uiux_jobs, @products_jobs

MySQL
MySQL
995 участник(ов)

The group is about MySQL. For code use hastebin.com. Admin: @smlkw

phpGeeksJunior
phpGeeksJunior
980 участник(ов)

Группа для новичков. Не стесняйтесь задавать вопросы по php. Не флудить!!!! Правила и полезные ссылки https://gist.github.com/exileed/a53dd0617b35a705ff44b38c8028e6a5 Бест от пхпгикс https://t.me/best_of_phpgeeks

phpclub.ru
phpclub.ru
872 участник(ов)

Официальный чат phpclub.ru - остерегайтесь подделок #rules Правила группы - уважайте друг друга. Скриншоты -> ссылками. Код -> pastebin.com. Вакансии строго -> https://goo.gl/4bNxym, в чат ссылку. За рекламу и мат - БАН!

Devall | PHP
Devall | PHP
272 участник(ов)

Пристанище для восходящих звёзд разработки, которые перейдут на более адекватные языки. http://combot.org/chat/-1001014863761 Инвайт: j.mp/devallphp