PHP: Если операторы непреднамеренно приводят к обновлению нескольких столбцов MySQL? - PullRequest
3 голосов
/ 19 марта 2012

У меня есть форма на странице, содержащая:

  • текстовое поле для ввода имени имя_черна

  • текстовое поле для ввода имени дня (вформат ГГГГ-ММ-ДД)

  • поле выбора с именем «ресурс» с параметрами [Библиотека 1 или Библиотека 2]

  • aполе выбора со значениями [1,2,3 и 4] именованного блока.

В моей базе данных mysql есть поля: - Учитель

  • Library1block1

  • Library1block2

  • Library1block3

  • и т. Д.

Данные со страницы html передаются на страницу php, предназначенную длясопоставьте ресурс и блок с правильным полем mysql и обновите поле таким образом, чтобы в него были вставлены данные из текстового поля «имя_чурнала».

if ($_POST['resource']="Library 1" and $_POST['block']="1")
    {mysql_query(
    "UPDATE Resources
    SET Teacher='yes', Library1block1='$_POST[teachername]'
    WHERE Date='$_POST[day]'");}
if ($_POST['resource']="Library 1" and $_POST['block']="2")
    {mysql_query(
    "UPDATE Resources
    SET Teacher='yes', Library1block2='$_POST[teachername]'
    WHERE Date='$_POST[day]'");}

Ожидается: - Введите «Мистер Смит».в текстовом поле ввода текста выберите «Библиотека 1» и «1» в меню выбора и введите «2012-03-16» в поле ввода текста с именем день

  • Данныесохраняются и передаются в php-скрипт

  • оператор if обновляет запись базы данных, содержащую поле, соответствующее полю «ресурс» и полю «блок» (library1b1, library1b2 и т. д.), длядата вводится в текстовое поле дня

  • поле обновляется, а подппоследовательный оператор if проверяет соответствие введенных данных правильному полю mysql

Результат: все поля (не только указанное поле) обновляются в соответствии с первым оператором if.

EX: Вход в "Mr. Smith" для имя пользователя, выбор "Library 1", выбор "1" для блока и ввод "2012-03-16" для даты не обновляет только Library1block1поле, но также обновляет поля Library1block2 и library2block1.

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

Помогите, пожалуйста?

Ответы [ 3 ]

3 голосов
/ 19 марта 2012

Вы совершаете общую ошибку, используя оператор присваивания (=), а не оператор равенства (==).В строках, которые выглядят так:

if($_POST['resource']="Library 1")

Измените их, используя оператор сравнения:

if($_POST['resource'] == "Library 1")
2 голосов
/ 19 марта 2012

Люди, которые дали ответы, проделали хорошую работу, но я хотел бы добавить один маленький трюк, который мне нравится иногда использовать (в зависимости от языка и т. Д.)

Обычно вы пишете оператор if как что-то вроде

if ( $var == 1 ) { do_stuff( $var ) }; //or whatever

Этот следующий простой трюк сделал эту потенциальную ошибку почти невозможной для меня (особенно с php).

Просто переключите их.

Так что вместо обычного:

if ( $var == 1 ) { do_stuff( $var ) }; //or whatever

Попробуйте вместо этого всякий раз, когда сможете:

if ( 1 == $var ) { do_stuff( $var ) }; //or whatever

Я почти уверен, что php 5.2+ не изменился до такой степени, что он больше не работает, но даже если вы допустите смертельную ошибку при использовании одного знака равенства, он все равно будет работать, потому что вы не можете присвоить значение к константе (числа являются постоянными значениями, верно?).

Я полагаю, что это зависит от поведения php всегда обрабатывать код слева направо:

if ( 1 = $var ) { do_stuff( $var ) }; //or whatever

И ты золотой! С тех пор, как я начал заниматься этим более 5 лет назад, я больше никогда не сталкивался с этой проблемой. 1 всегда 1, независимо от того, что вы делаете. Это хороший способ продумать ваши условные выражения, циклы и т. Д. В php.

Красота этого заключается в том, что она поражает простотой. «$ var» может быть множеством разных вещей, но число 1 - это всегда число 1. Я уверен, что это работает не для всех языков, но для php я часто его использую, и, очевидно, это хорошая привычка. в любом случае структурировать свой код таким образом.

0 голосов
/ 19 марта 2012

Вы должны использовать два знака равенства , как это у вас, если операторы сравнивают значения :

$_POST['resource']=="Library 1"

Это проверит, равно ли $_POST['resource'] (==) Library 1

Один знак равенства присваивает Library 1 $_POST['resource']

Вы можете проверить Операторы сравнения on php.net для получения дополнительной информации:

http://php.net/manual/en/language.operators.comparison.php

Редактировать:

Вы также должны использовать mysql_real_escape_string () для введенного пользователем значения, такого как $ _POST:

if ($_POST['resource'] == "Library 1" and $_POST['block'] == "2")
{
    mysql_query(
    "UPDATE Resources
    SET
        Teacher='yes',
        Library1block1='".mysql_real_escape_string($_POST['teachername'])."'
    WHERE
        Date='".mysql_real_escape_string($_POST['day'])."'"
    );
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...