Ru-Board.club
← Вернуться в раздел «Web-программирование»

» Поиск в базе MySQL

Автор: SparcoCF
Дата сообщения: 09.09.2009 16:58
Привет.
Есть в базе таблица следующей структуры:

Код: `id` int(50) NOT NULL auto_increment,
`code` varchar(10) default NULL,
`model` varchar(100) default NULL,
`type` varchar(100) default NULL,
`year` varchar(10) default NULL,
PRIMARY KEY (`id`)
Автор: Cheery
Дата сообщения: 09.09.2009 21:26
SparcoCF

Цитата:
Делаю запрос и вуаля, запрос выполняется. В чем же может быть проблема ?

в том, что у вас там либо пробел, либо символ переноса строки.
очевидно же из

Цитата:
еще заметил один нюанс, если поле varchar(10) выставить в varchar(9)
то запрос дает результат но вот если год в это поле данные состоят не из 9 символов а например из 4-х (например 2004) то нет результата.

Автор: SparcoCF
Дата сообщения: 09.09.2009 21:52
Cheery
ну так дело в том что нет ни пробелов ни переноса строки. вот как я вставляю данные:

Код:     
$year = $temp[3];
$year = str_replace(' ','',$year);
$year = str_replace('\n','',$year);
$query="INSERT INTO cars SET code='$temp[0]',
    model='$temp[1]',
    type='".str_replace(' ','',$temp[2])."',
    year='".mysql_real_escape_string($year)."'";
Автор: Cheery
Дата сообщения: 09.09.2009 21:56
SparcoCF

Цитата:
вроди бы вырезаю все что нужно.

я так не думаю.
'\n' не является символом переноса строки в такой записи.
а вот "\n" является.. плюс не забывайте про формирование строки переноса в windows - \r\n
Автор: SparcoCF
Дата сообщения: 09.09.2009 22:00
гляньте вот так выглядит csv файл если открыть его в блокноте:
3990;Acura MDX;Внедорожник ;2000-2006
4098;Acura MDX;Внедорожник ;2006-
4099;Acura RDX;Внедорожник ;2006-
2031;Alfa Romeo 145/146;Хетчбек ;1994-2000

видно что есть пробелы но они успешно вырезаются. Ни табуляций ни переноса каретки нет.

Что можете посоветовать ? Может переменную $year пропускать через регулярку, что бы пропускались только цифры и знак - ? Что скажете ?
Автор: Cheery
Дата сообщения: 09.09.2009 22:07
SparcoCF

Цитата:
Ни табуляций ни переноса каретки нет.

не верю. там может быть и \0
длину строки посмотрите. если не совпадает с количеством символов, значит есть дополнительные.

Цитата:
Может переменную $year пропускать через регулярку, что бы пропускались только цифры и знак - ? Что скажете ?

как минимум www.php.net/trim
Автор: SparcoCF
Дата сообщения: 09.09.2009 22:53

Цитата:
не верю

Вы как Станиславский )))))))))
и правильно делаете .. сделал трим и все отлично. Спасибо.
Автор: israel_rider
Дата сообщения: 19.09.2009 18:28
Пипл, подскажить плиз. Необходимо, что бы при запросе выводились все строки, кроме той, у которой id = 3.
Я так и написал в запросе
...
WHERE id != 3
Работает. Но всё же... Хочется спросить, как делать правильно.

Добавлено:
Может, IGNORE INDEX ?
Автор: Cheery
Дата сообщения: 19.09.2009 18:36
israel_rider
в мануал сложно посмотреть????
Либо так, либо <>
Автор: israel_rider
Дата сообщения: 26.09.2009 10:31
Пипл, помогите пожалуйста. Я ни чего не могу понять. Вот запрос -

Код:
SELECT distinct i.identifier, t.inode, Count(t.inode) AS cnt
FROM tag_inode t, inode i
WHERE (tagname="albatros" Or tagname="jerusalem" Or tagname="old city" Or tagname="aerial" Or tagname="view" Or tagname="jaffa gate" Or tagname="wall" Or tagname="walls" Or tagname="hill" Or tagname="citadel")
And i.identifier <> 11630
And t.inode = i.inode
GROUP BY i.identifier
HAVING t.inode<>0 And cnt > 5
ORDER BY cnt DESC
Автор: Cheery
Дата сообщения: 26.09.2009 10:49
israel_rider
сколько раз повторять - дочитайте хотя бы один учебник до конца.
Связывающее слово AS можно не писать
Автор: israel_rider
Дата сообщения: 26.09.2009 12:45

Цитата:
Связывающее слово AS можно не писать

Тогда получается, что "t" это алиас таблицы "tag_inode", и "i" это алиас таблицы "inode"? Я правильно Вас понял?
Автор: Cheery
Дата сообщения: 26.09.2009 15:04
israel_rider
да
Автор: israel_rider
Дата сообщения: 28.09.2009 21:34
Составил запрос:

Код: $SQL = "
SELECT photo_id, SUM(watch_count) AS `total_watch_count`
FROM `tbl_viewed`
WHERE photo_id IN (SELECT photo_id FROM tbl_photos WHERE status = 1)
AND `timeviewed` > (MAX(timeviewed) - 31536000)
GROUP BY `photo_id`
ORDER BY `total_watch_count` DESC
LIMIT 0 , 10
";
Автор: Cheery
Дата сообщения: 28.09.2009 21:39
israel_rider

Цитата:
а точнее в выражении "MAX(timeviewed)" ошибка.

сколько раз повторять.. если выводит сообщение об ошибке - то показывайте это сообщение
Автор: israel_rider
Дата сообщения: 28.09.2009 21:45
Никакого сообщения не было. Просто я не получил ни чего из запроса. А когда я заменил MAX(timeviewed) на последнюю дату, то есть поставил просто
AND `timeviewed` > (1254034568 - 31536000),
то всё сработало. Я думал, ошибка очевидная....

Добавлено:
Вывел сообщение об ошибке:
Invalid query: Invalid use of group function
Вопрос - почему функция MAX использована неправильно?
Автор: Cheery
Дата сообщения: 28.09.2009 23:22
israel_rider
MAX применяется в выборке, а не условиях
делаете подзапрос для получения max значения
Автор: israel_rider
Дата сообщения: 29.09.2009 00:02
Cheery, большое спасибо за помощь. Пожалуйста, если можно, хотя бы элементарный пример подзапроса. Что бы мне было легче понять.
Автор: Cheery
Дата сообщения: 29.09.2009 00:03

Цитата:
AND `timeviewed` > ((SELECT MAX(поле) FROM table GROUP BY еще поле) - 31536000)

Автор: israel_rider
Дата сообщения: 29.09.2009 00:04
Сенкс!!!
Автор: mukas
Дата сообщения: 30.09.2009 02:42
<php
$result = mysql_query("SELECT * WHERE id=1")
?>

как изменится синтаксис если вместо 1 (где id=1) нужно написать переменное значение полученное выше, например $x
Автор: Cheery
Дата сообщения: 30.09.2009 02:47
mukas

Цитата:
$result = mysql_query("SELECT * WHERE id=".intval($x))

это если целочисленные значения
Автор: mukas
Дата сообщения: 30.09.2009 02:57
число целое. определяется верно. echo выводил для проверки.
вот код

Код: $query = "SELECT * FROM $mes WHERE AP_ID = '143'";
$res = mysql_query($query) or die(mysql_error());

while ($row = mysql_fetch_array($res)) {
$z = $row['USER_ID'];
$query2 = "SELECT * FROM $usr WHERE USER_ID = "intval($z);
$res2 = mysql_query($query2) or die(mysql_error());
$row2 = mysql_fetch_array($res2);
$x = floor($row['DATA_IN'] / 1048576);
$y = floor($row['DATA_OUT'] / 1048576);
echo('
<tr>
<td>'.$row2['FULLNAME'].'</td>
<td>'.$x.'</td>
<td>'.$y.'</td>
</tr>
');
}
echo('<tbody></table>');
Автор: Cheery
Дата сообщения: 30.09.2009 03:02
mukas

Цитата:
$query2 = "SELECT * FROM $usr WHERE USER_ID = "intval($z);

я не так написал.
и вообще в вашем случае можно одним запросом
Автор: mukas
Дата сообщения: 30.09.2009 03:10

Цитата:
я не так написал.

думаю это аналогично, я значение искомого USER_ID заменил на переменную $z
Каким образом одним запросом ведь выбор идет по значению AP_ID, которое отсутствует в таблице $usr
таблицы $usr и $mes объединяет только USER_ID
Автор: Cheery
Дата сообщения: 30.09.2009 03:18
mukas
SELECT * FROM $mes,$usr WHERE $mes.AP_ID = '143' AND $mes.user_id=$usr.user_id
надеюсь, что имена таблиц не вставляете из формы
Автор: mukas
Дата сообщения: 30.09.2009 17:28
еще один проблем

Код: $a = $_GET['god'];
$arg = $a."_".$_GET['mes'];

$query = "SELECT * FROM $mes,$usr,$dat WHERE $dat.AP_DATA = $arg AND $dat.AP_ID = $mes.AP_ID AND $mes.USER_ID = $usr.USER_ID";
Автор: Cheery
Дата сообщения: 30.09.2009 18:37
mukas
скажу то, что говорил и другим. Прежде чем задать вопрос - прочитайте хотя бы один учебник и до кучи вопросов просто не появится.
В вашем случае - прочитайте про sql injection. Далее, вставляя данные из формы - не забывайте про кавычки в запросе к базе, так как если в данных будет пробел, как у вас, то возникнут вот подобные проблемы
Автор: mukas
Дата сообщения: 01.10.2009 05:30
ок, щас так и дела. но вот нестандартная ситуация.
а предыдущий пост - да че то ступил из-за невнимательности. щас все решаемо, сижу думаю и изучаю сам


Код: mysql_connect($hostname,$username,$password) OR DIE("Не могу создать соединение ");
mysql_select_db($dbName) or die(mysql_error());
mysql_query("SET NAMES 'utf8'");

$arg1 = $_POST['arg1'];
$arg2 = $_POST['arg2'];
$arg3 = $_POST['arg3'];

$query = "SELECT * FROM $ust WHERE AP_ID = '$arg1' AND USER_ID = '$arg2'";
$res = mysql_query($query) or die(mysql_error());
$number = mysql_num_rows($res);
if ($number != 1) {
$query = "INSERT INTO $ust (AP_ID, USER_ID) VALUES ($arg1, $arg2)";
$res = mysql_query($query) or die(mysql_error());
}

$query = "UPDATE $ust SET TARIF = '$arg3' WHERE AP_ID = '$arg1' AND USER_ID = '$arg2'";
$res = mysql_query($query) or die(mysql_error());
Автор: Cheery
Дата сообщения: 01.10.2009 05:43
mukas
сколько раз повторять? насче sql injection в том числе. нельзя!!! данные из формы, не обработав, пихать в запрос таким образом

Цитата:
$arg1 = $_POST['arg1'];
$arg2 = $_POST['arg2'];
$arg3 = $_POST['arg3'];

читайте
www.php.net/mysql_real_escape_string
вам везет если экранирование автоматом включено. а если будет выключено?

Страницы: 1234

Предыдущая тема: Вопросы по CSS


Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.