| |
|
|
| | Здравствуйте всем! :)
Маленькое отступление, чтобы было понятно. Много лет пишу на Паскале, в Дельфях. Работаю с базами данных. На днях резко возникла необходимость написать самому некие скрипты на php. Зашел на этот замечательный сайт, прочитал самоучитель (кстати большое спасибо авторам! Замечательно написано, доходчиво и ясно! :) ). В осях все понятно (как говориться - буквы те же... :) ), но... Некоторые моменты остались вне моего понимания. В частности: есть пример
<?
$date = "august 10 2003";
list($month, $day, $year) = sscanf($date, "%s %d %d");
echo("Date: $day-".substr($month,0,3)."-$year");
?>
|
Абсолютно не понял, для чего substr($month,0,3) заключено в точки? Что вообще представляет из себя точка в php? Видел такой скрипт:
$message=$body;
$message .=$adding;
|
Тут вроде как ясно, точки показывают, что присоединяется кусок текста (вроде объединения строк), а где еще используются точки?
То же самое и с другими знаками препинания. Для чего используются знаки вопроса, слэши, плюсы, знаки равенства по два три раза подряд, знаки "=>" или "->"? Чем отличаются парные кавычки от одинарных, скобки фигурные, квадратные, круглые? Ну в принципе суть вопроса понятна, азы так сказать... Возможно я и не доглядел чего-то в учебнике, не обессудьте, но есть большое пожелание авторам написать (по возможности конечно :) ) пунктуацию языка. Или направьте меня на путь истинный в направлении где взять инфу именно по пунктуации (с прочим вопросов не возникло). :)
Теперь более конкретно.
Задача:
Из текстового файла перенести текст в базу (MySQL).
Файл имеет формат:
12345пробелАБВпробел12345пробелАБВ // 12345 и АБВ это просто первое что пришло в голову, это текстовые поля с разными значениями.
некоторых элементов может не быть, т.е. следующие строки файла могут выглядеть так
12345пробел12345 (нет первых АБВ и последних АБВ)
12345пробелАБВпробелАБВ (нет последних АБВ)
и т.п. Критериев есть два: Поля АБВ содержат только буквы, поля 12345 начинаются только с цифры (могут и с нуля), но дальше могут встречаться любые знаки.
Пример строки: 12-12 АПС 23+89 ЛДГ
Поля таблицы, условно а1,b1,c1,d1 (четыре поля)должны быть заполнены в любом случае (либо пробелом, либо пустым значением), но в строгом соответствии: в поле a1 должно попасть первое 1234, в поле b1 первое АБВ, в поле с1 второе 12345 и в поле d1 второе АБВ. Тупик оказался в том, что не разложить каждую строку в соответствующие поля.
Первый проход выполняется нормально (см.код), в строке файла есть все четыре значения. Второй проход затыкается, т.к. в переменной $p1 должен (но не оказывается) оказаться пробел или пустое значение(в тексте нет этого значения), и только в переменную $t2 должно попасть 12345(по условию) и т.д. Т.е. строки со всеми значениями залетают нормально, а вот если нет хотя бы одного значения начинается бардак.
$file_array = file("xxx.txt");
if(!$file_array)
{
echo("Ошибка открытия файла");
}
else
{
$query = "DELETE FROM yyyy"; //очищаем таблицу (она уже открыта, это часть кода)
$result = mysql_query($query) or die(mysql_error().'<br>'.$query); //выполняем запрос
for($i=0; $i < count($file_array); $i++) // это из учебника (не понял опять же зачем два раза плюс?)
{
$str = sscanf($file_array[$i],"%s %s %s %s",&$t1, &$p1, &$t2, &$p2); //решил использовать эту функцию, показалось, что для моей задачи больше подходит
$query = "INSERT INTO yyyy SET
time_otspb = '".$t1."', //опять же не понял зачем переменные в точках? поставил по аналогии
prim_otspb = '".$p1."',
time_vspb = '".$t2."',
prim_vspb = '".$p2."'";
$result = mysql_query($query) or die(mysql_error().'<br>'.$query);
$t1='';$p1='';$t2='';$p2=''; //обнулял пременные, может есть лучше способ?
}
|
По идее надо действовать по такому пути. Проверять соответствует ли текст в переменной буквенному значению (или начальной цифре) и если нет, то дальше перекидывать значения. Но вот знания азбуки морзе php начинают подводить! :) Подтолкните опять в нужную сторону, на ум пока приходит что-то типа
$str = sscanf($file_array[$i],"%s %s %s %s",&$t1, &$p1, &$t2, &$p2);
if($p1!="[А-Я]") {$p2=$t2; $t2 = $p1; $p1=" ";}; //'это грубо конечно, но в осях.... и к тому же правильно не работает :)
|
Буду премного благодарен за любую посильную помощь! Только сразу в НЕ нужном направлении не посылайте! :)
С уважением Евгений aka gNEV. | |
| |
|
|
| |
|
|
| |
для: gNEV
(16.01.2007 в 23:31)
| | | [поправлено модератором] | |
| |
|
|
| |
|
|
| |
для: Sergey89
(16.01.2007 в 23:39)
| | | Просто замечательное направление! :)
А зачем тогда этот сайт, форум, если у нас на все про все есть мануал! :)
Я почти 20 лет изучаю всевозможные мануалы по различным языкам программирования, базам данных и т.п., видимо тут какой-то особенный мануал, пойду гляну... ;) | |
| |
|
|
| |
|
|
| |
для: gNEV
(17.01.2007 в 00:17)
| | | Я тоже себя часто об этом спрашиваю. И понял, что они нужны для того, чтобы разбиратсять с тем, чего нет в мане. ;-) А в этом мане есть почти все, точнее это все в пользовательских комментариях. Сам всегда все ответы нахожу в мане, а на форумах спрашиваю в крайних случаях. | |
| |
|
|
| |
|
|
| |
для: Sergey89
(17.01.2007 в 00:23)
| | | Да мануал однако хорош! :)
Теперь все стало ясно, правда так толком и не нашел два момента (символы -> и =>). Ну второй вроде для присваивания значений в массивах, а первый?
Все, решил свою задачку... :) Кривовато конечно, но работает :)
$str = sscanf($file_array[$i],"%s %s %s %s",&$t1, &$p1, &$t2, &$p2);
if(ord($p1)>=48 and ord($p1)<=57){$t2=$p1; $p1='';};
|
| |
| |
|
|
| |
|
|
| |
для: gNEV
(17.01.2007 в 01:54)
| | | Символы => правильн рещил, для разделения ключ=>значение массива. Потому как PHP поддерживает ассациативные массивы ($ar["key_text_name"]=2; $ar["key_text_name1"]="text_value";)
Символы -> для разделения свойств и методов объявленных членов класса.
//это сам класс как объект
class test_class(){
//это глобальная переменная класса
$_global_variable1=22;
//это метод класса
function open_class(){
//$this используется как указатель на этот класс (типа Me)
$this->_global_variable1 = 33;
}
}
$testcls=test_class();
print $testcls->_global_variable1; //пока 22
$testcls->open_class();
print $testcls->_global_variable1; //уже 33
|
$++, $i-- обычный инкремент декремент в цикле (на C так он и делается, а в VB Delphi $i=$i+1)
Кавычки очень сильн различаются, осторожно с ними. В одинарных кавычках все воспринимается как строка и не работают переменные. В двойных можно ставить переменные не разрывая строку точками:
$var1=22;
$test='это тест одиночных $var1'; //так и напишет $var1
$test1="это тест двойных var1"; //напишет текст и 22 в конце
|
| |
| |
|
|
| |
|
|
| |
для: gNEV
(16.01.2007 в 23:31)
| | | >Абсолютно не понял, для чего substr($month,0,3) заключено в точки?
Точка в PHP - это символ объединения подстрок - точками мы объединяем подстроки в единую строку. | |
| |
|
|
| |
|
|
| |
для: gNEV
(16.01.2007 в 23:31)
| | | >Чем отличаются парные кавычки от одинарных, скобки фигурные, квадратные, круглые?
Про кавычки можно почитать в теме по ссылке http://www.softtime.ru/forum/read.php?id_forum=1&id_theme=130.
Фигурные скобки - это аналог begin и end для Pascal
Круглые скобки имеют тоже значение, что и для Pascal | |
| |
|
|
| |
|
|
| |
для: cheops
(17.01.2007 в 15:16)
| | | + фигурные скобки для того, чтобы отделить такое понятие как символ строки от элемента массива.
<?php
$str = 'Привет!';
print $str{0}; // хотя можно и $str[0]; Выведет: П
?> | |
| |
|
|
| |
|
|
| |
для: Sergey89
(17.01.2007 в 15:22)
| | | Угу, и еще ... даже не знаю как его назвать:
<?
$str['word'] = 'Привет!';
print "{$str['word']}";
?>
|
| |
| |
|
|
| |
|
|
| |
для: kasmanaft
(17.01.2007 в 16:00)
| | | Сложный (фигурный) синтаксис =)
http://www.php.net/manual/ru/language.types.string.php | |
| |
|
|
|