2010-04-09 3 views
1

Мой код должен сохранить год, например 1999, в базу данных mysql, но это не будет. Он проверит, не набрал ли пользователь только числа и длиной не менее 4 цифр, или если ничего не было введено правильно, но оно не сохранит правильный год? Как я могу исправить эту проблему.Проблема проверки формы PHP?

Вот код PHP.

if(isset($_POST['year']) && intval($_POST['year']) && strlen($_POST['year']) == 4) { 
    $year = mysqli_real_escape_string($mysqli, $purifier->purify(htmlentities(strip_tags($_POST['year'])))); 
} else if($_POST['year'] && strlen($_POST['year']) < 4) { 
    echo '<p class="error">year is not correct!</p>'; 
} else if($_POST['year'] == NULL) { 
    // do something 
} 

Вот где код будет.

if (mysqli_num_rows($dbc) == 0) { 
      $mysqli = mysqli_connect("localhost", "root", "", "sitename"); 
      $dbc = mysqli_query($mysqli,"INSERT INTO users (user_id, year) 
             VALUES ('$user_id', '$year')"); 
    } 

    if ($dbc == TRUE) { 
      $dbc = mysqli_query($mysqli,"UPDATE users 
             SET year = '$year' 
             WHERE user_id = '$user_id'"); 

      echo '<p class="changes-saved">Your changes have been saved!</p>'; 

    } 

    if (!$dbc) { 
      print mysqli_error($mysqli); 
      return; 
    } 

Код указан вместе.

if (isset($_POST['submit'])) { 

if(isset($_POST['year']) && intval($_POST['year']) && strlen($_POST['year']) == 4) { 
    $year = mysqli_real_escape_string($mysqli, $purifier->purify(htmlentities(strip_tags($_POST['year'])))); 
} else if($_POST['year'] && strlen($_POST['year']) < 4) { 
    echo '<p class="error">year is not correct!</p>'; 
} else if($_POST['year'] == NULL) { 


    if (mysqli_num_rows($dbc) == 0) { 
      $mysqli = mysqli_connect("localhost", "root", "", "sitename"); 
      $dbc = mysqli_query($mysqli,"INSERT INTO users (user_id, year) 
             VALUES ('$user_id', '$year')"); 
    } 

    if ($dbc == TRUE) { 
      $dbc = mysqli_query($mysqli,"UPDATE users 
             SET year = '$year' 
             WHERE user_id = '$user_id'"); 

      echo '<p class="changes-saved">Your changes have been saved!</p>'; 

    } 

    if (!$dbc) { 
      print mysqli_error($mysqli); 
      return; 
    } 


    } 

} 

Проблема должна быть на этой линии.

if(isset($_POST['year']) && intval($_POST['year']) && strlen($_POST['year']) == 4) { 
$year = mysqli_real_escape_string($mysqli, $purifier->purify(htmlentities(strip_tags($_POST['year'])))); 
+0

Ok, так что «не будет сохранять правильный год», но что * это * это сделать? - распечатать сообщение об ошибке? сохранить неправильное значение? –

+0

Это просто не спасет правильный год, который он должен сделать. – TaG

+0

Спасибо за то, что вы обновили свой вопрос с помощью кода DB, но я до сих пор не вижу, как два кодовых блока связаны друг с другом? Вы вызываете if (mysqli_num_rows ($ dbc) == 0) сразу после первого блока кода? – klabranche

ответ

0

Вы, кажется, переходящие в $ год ваш сбежавшего значение строки года из вашего элемента формы, но, кажется, вы не должны делать что-либо с ним (по крайней мере, это все, что вам показать)?

Где код, который следует положить в базу данных?

Что-то вроде:

$ mysqli-> запрос ("вставить в таблицу (ColumnName) значения ('$ год')";

EDIT после обновления Пример кода:

Вы работаете код в БД, только если год является недействительным. Изменение кода, как показано на Давида/Нав. :-)

1

Во-первых, проверьте WHA t отправляется в $_POST['year'] с error_log($_POST['year']); или echo $_POST['year']; где-то выше вашего логического заявления.

Во-вторых, у вас на самом деле нет запросов, написанных в этом коде, просто переменная $year, которую я предполагаю, что вы пытаетесь дезинфицировать.

В-третьих, похоже, что у вас есть логическая ошибка в цепочке операторов if/else.

Попробуйте это.

if (isset($_POST['submit'])) 
{ 

if(isset($_POST['year']) && intval($_POST['year']) && strlen($_POST['year']) == 4) { 
    $year = mysqli_real_escape_string($mysqli, $purifier->purify(htmlentities(strip_tags($_POST['year'])))); 
} else if($_POST['year'] && strlen($_POST['year']) < 4) { 
    echo '<p class="error">year is not correct!</p>'; 
} else if($_POST['year'] == NULL) { 

} else { 
    if (mysqli_num_rows($dbc) == 0) { 
      $mysqli = mysqli_connect("localhost", "root", "", "sitename"); 
      $dbc = mysqli_query($mysqli,"INSERT INTO users (user_id, year) 
             VALUES ('$user_id', '$year')"); 
    } 

    if ($dbc == TRUE) { 
      $dbc = mysqli_query($mysqli,"UPDATE users 
             SET year = '$year' 
             WHERE user_id = '$user_id'"); 

      echo '<p class="changes-saved">Your changes have been saved!</p>'; 

    } 

    if (!$dbc) { 
      print mysqli_error($mysqli); 
      return; 
    } 


    } 

} 
+0

это даже не работало, поэтому я использовал print_r, он показывает только значение. – TaG

+0

это не работало ahhhhhhhhhhhhhhhhhhhhhhh: o, спасибо, хотя. – TaG

+0

Начните отладку затем. Добавьте 'error_log' в различные строки и выясните, где он не делает то, что вы намереваетесь сделать. –

1

Выполняется только запрос, если $ _POST ["year"] == NULL. Вы уверены, что это то, что вы хотите делать?

Может изменить первый блок на что-то вроде:

if(isset($_POST['year']) && intval($_POST['year']) && strlen($_POST['year']) == 4) { 
    $year = mysqli_real_escape_string($mysqli, $purifier->purify(htmlentities(strip_tags($_POST['year'])))); 
} else if($_POST['year'] && strlen($_POST['year']) < 4) { 
    echo '<p class="error">year is not correct!</p>'; 
} 

if (isset($year)) { 
+0

да, эта часть кода, если поле остается пустым. – TaG

+0

это не сработало :( – TaG

0

Я думаю, что Дэвид имеет это право. Попробуйте изменить весь код вы предоставили выше:

if (isset($_POST['submit'])) 
{ 
    if(isset($_POST['year']) && intval($_POST['year']) && strlen($_POST['year']) == 4) { 
     $year = mysqli_real_escape_string($mysqli, $purifier->purify(htmlentities(strip_tags($_POST['year'])))); 
    } else if($_POST['year'] && strlen($_POST['year']) < 4) { 
     echo '<p class="error">year is not correct!</p>'; 
    } else { 
     // echo 'Year is blank' or whatever you like here 
    } 

    // if $_POST['year'] was entered correctly, $year will now 
    // have an assigned value and the mysql query will exit 
    if (isset($year)) { 
     if (mysqli_num_rows($dbc) == 0) { 
       $mysqli = mysqli_connect("localhost", "root", "", "sitename"); 
       $dbc = mysqli_query($mysqli,"INSERT INTO users (user_id, year) 
              VALUES ('$user_id', '$year')"); 
       // uncomment below to see the query 
       // echo "INSERT INTO users (user_id, year) VALUES ('$user_id', '$year')"; 
     } 
     // I'd suggest changing this if ($dbc) { to: 
     else { 
       $dbc = mysqli_query($mysqli,"UPDATE users 
              SET year = '$year' 
              WHERE user_id = '$user_id'"); 
       // uncomment below to see the query 
       // echo "UPDATE users SET year = '$year' WHERE user_id = '$user_id'"; 
       echo '<p class="changes-saved">Your changes have been saved!</p>'; 
     } 
     if (!$dbc) { 
       print mysqli_error($mysqli); 
       return; 
     } 


     } 
    } 
} 

Кроме того, учитывая, что оба ваших первоначальные запросы были внутри индивидуальным, если блоки, а не если-то еще заявления, это можно как-то, что ни один запрос был даже будучи казнены. Вышеприведенный код изменяет его на инструкцию if-else, поэтому будет выполняться хотя бы один из запросов. Я считаю, что это было намерение исходного кода.

Если он еще не работает, раскомментируйте строки, чтобы эхо-запросы и посмотреть, что на самом деле отправляется в базу данных.

0

Вы уверены, что работают слишком трудно дезинфицировать свои данные:

if(isset($_POST['year']) && intval($_POST['year']) && strlen($_POST['year']) == 4) { 

Fine. Это хорошо, чтобы увидеть, если значение фактически присутствует в представленных данных, и если есть какая-то числовое значение в поле, но ...

$year = mysqli_real_escape_string($mysqli, $purifier->purify(htmlentities(strip_tags($_POST['year'])))); 

Если эффект от всего, что для того, чтобы ничего не нечисловая там, то почему бы не просто сделать что-то вроде:

$year = null; 
if (isset($_POST['year'])) { 
    $year = preg_replace('/\D/', '', $_POST['year']) // replace anything non-numeric with nothing 
    if ($year < 1000) { 
     $year = null; 
    ) 
} 

Это позволяет избавиться от любых попыток HTML или SQL или яваскрипта инъекции, убедитесь, что вы получили чистые числовые данные, а также гарантирует, что вы имеете получил как минимум 4-значный год, а также был y10k, y100k и т. д. ... совместимым.

После $ года Очищенное, то вы можете вставить его в базу данных, как это:

if (!isnull($year)) { 
    $sql = <<<EOF 
INSERT INTO users (user_id, year) 
VALUES ($user_id, $year) 
ON DUPLICATE KEY UPDATE 
    year=VALUES(year); 
EOF; 
    $stmt = mysqli_query($sql) or die("Query error: " . mysqli_error()): 
} 
Смежные вопросы