2010-04-27 3 views
0

Я пытаюсь проверить, не введен ли цвет в базу данных, если цвет не должен быть введен и сохранен в базе данных, и должен отображаться следующий код ошибки <p>This color has already been entered!</p>. Но по какой-то причине я не могу заставить это работать, может кто-то мне помочь?Задача проверки PHP и MySQL

Имена цветов вводятся в $_POST['color'], который является массивом, введенным пользователем.

Адрес: html code, который собирает цветы.

<input type="text" name="color[]" /> 
<input type="text" name="color[]" /> 
<input type="text" name="color[]" /> 
<input type="text" name="color[]" /> 
<input type="text" name="color[]" /> 
<input type="text" name="color[]" /> 
<input type="text" name="color[]" /> 
<input type="text" name="color[]" /> 
<input type="text" name="color[]" /> 

Вот код PHP & MySQL.

for($i=0; $i < count($_POST['color']); $i++) { 
    $color = "'" . $_POST['color'][$i] . "'"; 
} 

$mysqli = mysqli_connect("localhost", "root", "", "sitename"); 
$dbc = mysqli_query($mysqli,"SELECT * 
          FROM colors 
          WHERE color = '$color' 
          AND user = '$user_id' "); 

if(mysqli_num_rows($dbc) == TRUE) { 
    echo '<p>This color has already been entered!</p>'; 
} else if(mysqli_num_rows($dbc) == 0) { 
    // enter the color into the database 
} 
+0

Вы знаете, какой SQL-запрос вы хотите запустить? –

+0

Вы переписываете '$ color' в свой оператор for, поэтому берется только последний. Но в любом случае, если вы напечатаете '

Этот цвет уже введен!

'как пользователь знает **, который ** один из них? –

+0

@Col. Шрапнель, что ты имеешь в виду? – IPADvsSLATE

ответ

1

Чтобы избежать ненужного querys вы должны получать все цвета первыми и проверить против них:

$colors = array(); 
$mysqli = mysqli_connect("localhost", "root", "", "sitename"); 
if($result = mysqli_query($mysqli,"SELECT color FROM colors WHERE user = '$user_id' ") { 
    while($row = mysqli_fetch_array($result)) { 
     $colors[] = $row['color']; 
    } 
    mysqli_free_result($result); 
} 

foreach($_POST['color'] as $color) { 
    if(in_array($color, $colors) { 
     echo '<p>Color ' . $color . ' has already been entered!</p>'; 
    } 
    else { 
     // enter the color into the database 
    } 
} 

Убедитесь, что дезинфицировать ввод данных пользователя!

0

У вас есть несколько цветов, поэтому вы должны использовать что-то вроде следующего.

$mysqli = mysqli_connect("localhost", "root", "", "sitename"); 

for($i=0; $i < count($_POST['color']); $i++) { 
    $color = "'" . $_POST['color'][$i] . "'"; 

    $dbc = mysqli_query($mysqli,"SELECT * 
          FROM colors 
          WHERE color = '$color' 
          AND user = '$user_id' "); 

    if(mysqli_num_rows($dbc) == TRUE) { 
     echo '<p>'.$color.' color has already been entered!</p>'; 
    } else if(mysqli_num_rows($dbc) == 0) { 
    // enter the color into the database 
    } 
} 
+0

Помните также проблемы с инъекцией. 'mysql_real_escape_string ($ _ POST ['color'] [$ i])', 'htmlspecialchars ($ color)' ... – bobince

+0

Я получаю следующую ошибку: mysqli_num_rows() ожидает, что параметр 1 будет mysqli_result, boolean given', который является этим line 'if (mysqli_num_rows ($ dbc) == TRUE) {' – IPADvsSLATE

0

Я предполагаю, что этот вопрос вы Runnig в том, что соединение с базой данных Allready открыт при попытке ввести новые значения в базу данных. Решение состоит в том, чтобы сначала извлечь все из базы данных в массив, а затем выполнить ваши проверки и добавить соответственно.

0

Вы должны использовать оператор IN. Например,

$color = null; 
for($i=0; $i < count($_POST['color']); $i++) { 
    if ($color == null) 
     $sep = ''; 
    else 
     $sep = ','; 
    $color = $sep . "'" . $_POST['color'][$i] . "'"; 
} 

$mysqli = mysqli_connect("localhost", "root", "", "sitename"); 
$dbc = mysqli_query($mysqli,"SELECT * 
          FROM colors 
          WHERE color IN ($color) 
          AND user = '$user_id' "); 
0

Это не ответ на самом деле, но очень важная вещь, чтобы узнать:

Я имею в виду простую вещь: сначала вам придется иметь дело с SQL только, без PHP или HTML. Создайте SQL-запрос, чтобы проверить цвета, запустить его, протестировать его и после того, как вы выполнили его, - перейти на PHP. попытайтесь создать тот же запрос из переменной и сравните с примером один. Как только вы закончите, вы можете продолжить HTML.

Таким образом, процесс развития должен быть разделен на 3 этапа: этап

  1. SQL. Создайте запрос. Если вы не знаете, какой запрос вы хотите, спросите здесь о SO somethink как «У меня есть 3 имени цвета и таблица. Как проверить, существует ли какой-либо из этих цветов в таблице». После завершения - проверьте его, чтобы убедиться, что запрос выполняется нормально и возвращает желаемые результаты.
  2. PHP этап. После того, как у вас есть запрос, повторите его из своего PHP-скрипта. И напишите код ниже, код, который производит этот запрос из некоторых переменных. Распечатайте его, чтобы сравнить, пока вы не получите оба запроса одинаковыми.
  3. HTML этап. Создайте HTML-форму, которая отправит имена цветов в PHP-скрипт, который будет создавать SQL-запрос из них и, наконец, запустить его.

Помните: знать, какой запрос вы хотите запустить, очень-очень важно! Без этих знаний вы не можете идти дальше
В каждом ответе здесь не упоминается сам SQL-запрос.