![smile.gif](http://phpforum.ru/html/emoticons/smile.gif)
//поисковая строка
echo "<input type=text name='title' size=60 >";
echo "<input type='submit' name=submit value='Search'>";
echo "<input type='reset' name=reset value='Reset'>";
$t = $_POST['title'];
if (isset($t)) {
$query = "SELECT * FROM $table WHERE title LIKE '%$t%'";
$res = mysql_query($query) or die(mysql_error());
$fields = mysql_num_fields($res);
$n1 = mysql_num_rows($res);
if ($n1>0) {
echo "найдено $n1 записей";
if(mysql_num_fields($res) > 0){
echo "<table><tr>";
//выводим поля таблицы
for($i = 0;$i < mysql_num_fields($res)$i++){
$row = mysql_fetch_field($res, $i);
echo "<th>". $row -> name ."</th>";
}
echo "<th>check</th>";
echo '</tr>';
while($r = mysql_fetch_assoc($res)){
if($j == mysql_num_fields($res)){
$j = 0;
echo '<tr>';
}//выводим контент
while($j < mysql_num_fields($res)){
$row = mysql_fetch_field($res, $j);
echo "<td>". $r[$row->name] ."</td>";
$j++;
}
//добавляем графу с чекбоксами
echo '<th><input name="id[]" type="checkbox" value='.$r['id'].'></th>';
$id = $_POST['id'];
if ($id){
foreach ($id as $val){
$ins = ("
INSERT INTO Journal.Realization (ISBN, title, price, number) SELECT ISBN, title,
price_1,1 FROM ".$db.".".$table." where id=$val
");
if($_SERVER['REQUEST_METHOD'] == 'POST'){
$result = mysql_query($ins) or die(mysql_error());
header("Location:index1.php?db=Journal&t=Realization");
}
}
}
}
}
echo '</tr>';
echo '</table><br>';
?>
<td><input type=submit name='add' value='OK'></td>
</form>
<?php
}
else echo "Ничего не найдено";
}
Спустя 5 часов, 42 минуты, 40 секунд (16.02.2010 - 09:20) sergeiss написал(а):
1. В любом случае следующий код неверный
Потому что переменная $t будет ВСЕГДА определена.
То, что ты хочешь тут сделать, делается по-другому:
Та же проблема с $id. Плюс к тому, ты не проверяешь тип $id, подразумевая, что это массив. А это вовсе не очевидно!
2. Нету защиты от SQL-инъекции...
3. Форму лучше всегда располагать после обработчика данных, чтобы можно было вывести юзеру то, что он ввел ранее. Ты же данные введенные обработаешь, и, соответственно, можешь вывести то, что юзер вводил. Это полезно, например, для редактирования некорректно введенных данных.
4. Команда вставки у тебя такая:
Вопрос: а сколько строк выбирается СЕЛЕКТом? Скорее всего, их там было создано три штуки, потому и вставляется три записи.
$t = $_POST['title'];
if (isset($t))...
Потому что переменная $t будет ВСЕГДА определена.
То, что ты хочешь тут сделать, делается по-другому:
$t=isset( $_POST['title'] ) ? $_POST['title'] : false;
if( $t !== false ) ....
Та же проблема с $id. Плюс к тому, ты не проверяешь тип $id, подразумевая, что это массив. А это вовсе не очевидно!
2. Нету защиты от SQL-инъекции...
3. Форму лучше всегда располагать после обработчика данных, чтобы можно было вывести юзеру то, что он ввел ранее. Ты же данные введенные обработаешь, и, соответственно, можешь вывести то, что юзер вводил. Это полезно, например, для редактирования некорректно введенных данных.
4. Команда вставки у тебя такая:
INSERT INTO Journal.Realization (ISBN, title, price, number) SELECT ISBN, title, price_1,1 FROM ".$db.".".$table." where id=$val</span>
Вопрос: а сколько строк выбирается СЕЛЕКТом? Скорее всего, их там было создано три штуки, потому и вставляется три записи.
Спустя 8 часов, 49 минут, 17 секунд (16.02.2010 - 18:09) Олька87 написал(а):
Цитата (sergeiss @ 16.02.2010 - 06:20) |
1. В любом случае следующий код неверный$t = $_POST['title']; Потому что переменная $t будет ВСЕГДА определена. То, что ты хочешь тут сделать, делается по-другому: $t=isset( $_POST['title'] ) ? $_POST['title'] : false; |
Вот тут вот не вижу разницы, одинаково работает что ваш, что мой вариант...Переменная $t не всегда определена, если она не isset, тогда она 0, выводится все подряд, что есть в таблице $table. А насчет СЕЛЕКТА Вы конечно правы..
![unsure.gif](http://phpforum.ru/html/emoticons/unsure.gif)
![smile.gif](http://phpforum.ru/html/emoticons/smile.gif)
Спустя 4 минуты, 20 секунд (16.02.2010 - 18:13) Олька87 написал(а):
Цитата (sergeiss @ 16.02.2010 - 06:20) |
ты не проверяешь тип $id, подразумевая, что это массив. А это вовсе не очевидно! |
Почему же не очевидно, ведь написано же
echo '<th><input name="id[]" type="checkbox" value='.$r['id'].'></th>';
Это разве не означает, что $id массив?
Спустя 14 часов, 47 минут, 21 секунда (17.02.2010 - 09:01) sergeiss написал(а):
Цитата (Олька87 @ 16.02.2010 - 19:13) |
Это разве не означает, что $id массив? |
Сорри, пропустил
![rolleyes.gif](http://phpforum.ru/html/emoticons/rolleyes.gif)
Затем. isset определяет, что переменная определена или не определена.
Если я сделал назначение $t=...., то переменная будет определена!!! Вне зависимости от имеющейся в ней величины. Даже если мы назначим этой переменной нечто, что само по себе не было назначено (например, $_POST['text'], который не был определен), то всё равно $t будет существовать.
Если уж очень хочется именно так работать, то хотя бы используй empty()
if( !empty($t) ) ....
Но лучше делай так, как я показал.
Цитата (Олька87 @ 16.02.2010 - 19:09) |
Если сделать уникальным какой нибудь столбец в таблице Realization, тогда добавляется без дупликатов, а есть ли еще какие-нибудь варианты? намекните |
Почитай про INSERT .... ON DUPLICATE KEY UPDATE ... - я думаю, это то, что тебе нужно.
Спустя 1 день, 9 часов, 4 минуты, 34 секунды (18.02.2010 - 18:05) Олька87 написал(а):
Спасибо! а возможно добавление без дупликатов, не делая уникальных столбцов? Помимо id я имею в виду.
Спустя 15 часов, 20 минут, 17 секунд (19.02.2010 - 09:25) sergeiss написал(а):
Делаешь триггер вставки данных, в котором проверяешь всё, что угодно. И либо разрешаешь вставку данной конкретной строки, либо запрещаешь ее.
Спустя 13 часов, 38 минут, 56 секунд (19.02.2010 - 23:04) Олька87 написал(а):
Большое спасибо, щас почитаем про триггер
![user posted image](http://pharm-forum.ru/smiles/april/winkel2.gif)