Php, XML и може би Cron

sentenello

Registered
Здравейте,
Целта ми е да направя един php файл който да дърпа информация от .XML и да го вкарва в мои MSQL. Като тази процедура да се повторя всеки понеделник да кажем.

Тъй като не съм много наясно дали това изпълняване на файла как точно става, написах и Cron в заглавието защото съм чувал че става с него. Въпроса ми е ако имам пхп файл който дърпа информацията от xml и я вкарва в msql, и пхп файла ми се намира на адрес domain.com/test.php. Когато отворя този линк(файл), тогава ще се изпълнява вътре кода и ще дърпа информацията нали? Правилно ли разсъждавам и къде бъркам ?
 
другият вариант е да го пускаш в терминала - php /path/to/test.php - както и всъщност ще направиш, ако ползваш cron.
 
Още едно въпросче в темата да го пусна направо. Ако датата е в този формат start_date="2014-09-13T12:45:00".. в какъв вид трябва да го записвам ? TIMESTAMP ?
 
sentenello каза:
Още едно въпросче в темата да го пусна направо. Ако датата е в този формат start_date="2014-09-13T12:45:00".. в какъв вид трябва да го записвам ? TIMESTAMP ?
Таймстамп автоматично обновява датата при всеки update i insert. Изполвай колона от тип
DATETIME

п.п. предполагам че това "Т" между часа и датата означава спейс и е случайна грешка?
 
sentenello каза:
Не е правописна грешка. Сега проверих във XML-я файл и във всеки един ред го има това "T"
В такъв случай ще трябва да използваш допълнително функцията str replace и да заместиш т-то със спейс, иначе датата няма да се запише правилно:
PHP:
$date = "2014-09-13T12:45:00";
$date  = str_replace("T", " ", $date);
//чак след това заявката
 
anonimen каза:
sentenello каза:
Не е правописна грешка. Сега проверих във XML-я файл и във всеки един ред го има това "T"
В такъв случай ще трябва да използваш допълнително функцията str replace и да заместиш т-то със спейс, иначе датата няма да се запише правилно:
PHP:
$date = "2014-09-13T12:45:00";
$date  = str_replace("T", " ", $date);
//чак след това заявката

Благодаря ти. А мога ли да попитам също.

в пхп файла си имам
Код:
foreach( $searchNode as $searchNode ) 
{ 
    $valueID = $searchNode->getAttribute('id'); 

    $xmlDate = $searchNode->getElementsByTagName( "choice " ); 
    $valueDate = $xmlDate->item(0)->nodeValue;

А в хмл има
Код:
<choice name="1 - 1" id="99778369" odd="6.25"/>
<choice name="1 - 2" id="99778393"/>
<choice name="2 - 1" id="99778381"/>
<choice name="2 - 2" id="99778387" />

Как точно трябва да си преправя кода за да вземам choice name ?
 
Ето това:
$valueID = $searchNode->getAttribute('id');

трябва да стане така:
$valueName = $searchNode->getAttribute('name');

Това е само предположение, не знам коя променлива за какво се отнася.

За да ти стане ясна работата с xml може да плтърсиш в гугъл за php domdocument или за simple xml load file, зависи какво използваш.
 
Направих грешка че не дадох целия код.. ето го xml

Код:
<event name="Eng. Premier League" id="3"><choice name="1 - 1" id="99778369" odd="6.25"/>
<choice name="1 - 2" id="99778393" odd="8.50"/>
<choice name="2 - 1" id="99778381" odd="9.50"/>
<choice name="2 - 2" id="99778387" odd="10.50"/>

Ето го и php-to

Код:
$searchNode = $xmlDoc->getElementsByTagName( "event" ); 
foreach( $searchNode as $searchNode ) 
{ 
    $valueID = $searchNode->getAttribute('id'); 

    $xmlDate = $searchNode->getElementsByTagName( "match" ); 
    $valueDate = $xmlDate->item(0)->nodeValue; 

    $xmlAuthorID = $searchNode->getElementsByTagName("choice"); 
    $valueAuthorID = $xmlAuthorID->item(0)->nodeValue; 
	
    
    echo "$valueID - $valueDate - $valueAuthorID\n  </br>"; 
}

В форича трябва май да вкарам нещо което да взема ред по ред choice name или се бъркам, че вече малко ми се спи пък и не съм писал доста време :Д
 
Това нещо не ми се връзва -
$xmlDate = $searchNode->getElementsByTagName( "match" );
$valueDate = $xmlDate->item(0)->nodeValue;
никъде нямаш таг "<match></match>" :?

Не е нужно да даваш истинския xml, просто дай структурата с примерни данни и какво очакваш да изведе :?:
 
структурата е това

Код:
<event name="Eng. Premier League" id="3">
<match name="Arsenal - Manchester City" id="779205" start_date="2014-09-13T12:45:00" live_id="" streaming="0">
<bets>
<bet code="Ftb_Mr3" name="Match Result" id="13960751">
<choice name="%1%" id="99778015" odd="2.90"/>
<choice name="Draw" id="99778023" odd="3.25"/>
<choice name="%2%" id="99778031" odd="2.35"/>
</bet>
<bet code="Ftb_Csc" name="Correct Score" id="13960803">
<choice name="1 - 1" id="99778369" odd="6.25"/>
<choice name="1 - 2" id="99778393" odd="8.50"/>
<choice name="2 - 1" id="99778381" odd="9.50"/>

Искам да изведа (запиша в mysql) името на лигата (event name) , кой с кой играе, датата и съответно както се вижда отдолу възможния краен резултат и възможния точен резултат.
 
С кода който написах в момента успях да изведа една част от информацията, но така и не мога да разбера как да направя това което искам.
структурата на XML е..
Код:
<event name="svetovno" >
    <match name="WC2010"> 
        <bet name="pobeditel">
             <choice name="bulgaria"/>
             <choice name="spain"/>
             <choice name="portugal"/>
        </bet>
     </match>
</event>

С моя код успявам да изкарам name само на един от таговете.
Код:
$searchNode = $xmlDoc->getElementsByTagName( "choice" ); 

foreach  ( $searchNode as $searchNode)
{ 

    $valueID = $searchNode->getAttribute('name'); 
    
    echo "$valueID - </br>"; 
	
}
В примера е на тага choice...

какъв код ми трябва за да взема целия event и после да си ехвам който name си поискам? Ако взема с getElementsByTagName( "event" ) , после как да изведа choice name ?
 
PHP:
//евентите
$events = $xmlDoc->getElementsByTagName( "event" );

//минаваме през всички евенти
foreach ($events as $event) {

	echo "Евент: " . $event->getAttribute('name') . "<br>";
	
	//мачовете в евента
	$matches = $event->getElementsByTagName("match");
	
	//минаваме през всички мачове
	foreach($matches as $match) {
	
		echo "Името на мача е: " . $match->getAttribute("name") . "<br>";
		
		$bets = $match->getElementsByTagName('bet');
		foreach ($bets as $bet) {
		
			echo "Залагане: ". $bet->getAttribute('name') . "<br>";
			echo "Възможности: <br>";
			
			$choices = $bet->getElementsByTagName('choice');
			foreach ($choices as $choice) {
			
				echo "Възможност: " . $choise->getAttribute('name') . "<br>";
			
			}
		
		}
	
	}

}
Ето с това ще минеш през целия xml и ще изкараш всички данни. Ти ще си изведеш само каквото ти трябва.

Проблемът при теб беше, че използваш лоши променливи - $node примерно няма откъде да разбереш, че става дума за евент, мач или избор.

п.п. Аз дори бих си направил две функции getName($tag) и getTags($from, $tagName), които да ми връщат съответно "name = '' " на тага и масив с таговете на даден елемент. (За по-четлив код, де)
 

Back
Горе