Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [XML][MySQL][PHP]Pobierz dane xml i wklej do mysql (skrypt PHP)
Forum PHP.pl > Forum > Przedszkole
pela222
Hej,
mam problem z uruchomieniem skryptu php który łączy się z moim CRM (Zoho CRM) i pobiera dane (kilka rekordów) w formacie XML. Następnie chodzi o "wsadzenie" tych rekordów do bazy mysql.
Jak narazie jedyn co midziała to tego typu zapytanie:
https://crm.zoho.com/crm/private/xml/Leads/...mp;scope=crmapi
i zwraca mi coś takiego w postaci xml:
  1. This XML file does not appear to have any style information associated with it. The document tree is shown below.
  2. <response uri="/crm/private/xml/Leads/getMyRecords">
  3. <result>
  4. <Leads>
  5. <row no="1">
  6. <FL val="LEADID">624745000000615068</FL>
  7. <FL val="SMOWNERID">624745000000053003</FL>
  8. <FL val="Lead Owner">
  9. <![CDATA[ Moje Imię ]]>
  10. </FL>
  11. <FL val="Company">
  12. <![CDATA[ Peplos Wine Restaurant ]]>
  13. </FL>
  14. <FL val="FirstName">
  15. <![CDATA[ Grzegorz ]]>
  16. </FL>
  17. <FL val="Last Name">
  18. <![CDATA[ Kowalski ]]>
  19. </FL>>
  20. <FL val="Created Time">
  21. <![CDATA[ 2014-02-28 12:41:17 ]]>
  22. </FL>
  23. </row>
  24. </Leads>
  25. </result>
  26. </response>


Plik php który miał by przetowrzyć to o co mi chodzi już niestety nie dziąła. Nie wiem dlaczego. Wydaje mi się że ten skrypt php wogóle nie pobiera danych z mojego CRM. Jak sprawdzić zanim włoże dane do mysql czy coś zostało pobrane? print_r questionmark.gif echo questionmark.gif
Plik php wyglada tak:
  1. <?php
  2.  
  3. /* NOTE: Define your mysql database parameters in moduleDependant class */
  4.  
  5. /* Constant Declarations */
  6. define("TARGETURL", "https://crm.zoho.com/crm/private/xml/Leads/getMyRecords");
  7.  
  8. /* user related parameter */
  9. define("AUTHTOKEN", "moj_token_autoryzacyjny");
  10. define("SCOPE", "crmapi");
  11.  
  12. /* create a object */
  13. $utilObj = new Utilities();
  14.  
  15.  
  16. /* set parameters */
  17. $parameter = "";
  18. $parameter = $utilObj->setParameter("scope", SCOPE, $parameter);
  19. $parameter = $utilObj->setParameter("authtoken", AUTHTOKEN, $parameter);
  20. $parameter = $utilObj->setParameter("selectColumns", "Leads(LEADID,First Name,Last Name,Company)", $parameter);
  21.  
  22. /* Call API */
  23. $response = $utilObj->sendCurlRequest(TARGETURL, $parameter);
  24.  
  25. $utilObj->parseXMLandInsertInDB($response);
  26.  
  27.  
  28.  
  29. class Utilities {
  30.  
  31.  
  32. public function setParameter($key, $value, $parameter) {
  33. if ($parameter === "" || strlen($parameter) == 0) {
  34. $parameter = $key . '=' . $value;
  35. } else {
  36. $parameter .= '&' . $key . '=' . $value;
  37. }
  38. return $parameter;
  39. }
  40.  
  41. public function parseXMLandInsertInDB($xmldata) {
  42. $xmlString = <<<XML
  43. $xmldata
  44. XML;
  45. $xml = simplexml_load_string($xmlString);
  46. if (isset($xml->result)) {
  47. $modeuleDependantObj = new moduleDependant();
  48. $output = $modeuleDependantObj->insertInDB($xml);
  49. } else if (isset($xml->error)) {
  50. echo "Error code: " . $xml->error->code . "<br/>";
  51. echo "Error message: " . $xml->error->message;
  52. }
  53. }
  54.  
  55. public function sendCurlRequest($url, $parameter) {
  56. try {
  57. /* initialize curl handle */
  58. $ch = curl_init();
  59. /* set url to send post request */
  60. curl_setopt($ch, CURLOPT_URL, $url);
  61. /* allow redirects */
  62. curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
  63. /* return a response into a variable */
  64. curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
  65. /* times out after 30s */
  66. curl_setopt($ch, CURLOPT_TIMEOUT, 30);
  67. /* set POST method */
  68. curl_setopt($ch, CURLOPT_POST, 1);
  69. /* add POST fields parameters */
  70. curl_setopt($ch, CURLOPT_POSTFIELDS, $parameter);
  71. /* execute the cURL */
  72. $result = curl_exec($ch);
  73. curl_close($ch);
  74. return $result;
  75. } catch (Exception $exception) {
  76. echo 'Exception Message: ' . $exception->getMessage() . '<br/>';
  77. echo 'Exception Trace: ' . $exception->getTraceAsString();
  78. }
  79. }
  80.  
  81.  
  82. }
  83.  
  84. class moduleDependant {
  85. /* Define your mysql database parameters */
  86.  
  87. private $host = "localhost";
  88. private $username = "root";
  89. private $password = "";
  90.  
  91. public function insertInDB($xml) {
  92. $numberOfRecords = count($xml->result->Leads->row);
  93. /* $records[row value][field value] */
  94. $records[][] = array();
  95. for ($i = 0; $i < $numberOfRecords; $i++) {
  96. $numberOfValues = count($xml->result->Leads->row[$i]->FL);
  97. for ($j = 0; $j < $numberOfValues; $j++) {
  98. switch ((string) $xml->result->Leads->row[$i]->FL[$j]['val']) {
  99. /* Get attributes as element indices */
  100. case 'LEADID':
  101. $records[$i]['LEADID'] = (string) $xml->result->Leads->row[$i]->FL[$j];
  102. break;
  103. case 'First Name':
  104. $records[$i]['First Name'] = (string) $xml->result->Leads->row[$i]->FL[$j];
  105. break;
  106. case 'Last Name':
  107. $records[$i]['Last Name'] = (string) $xml->result->Leads->row[$i]->FL[$j];
  108. break;
  109. case 'Company':
  110. $records[$i]['Company'] = (string) $xml->result->Leads->row[$i]->FL[$j];
  111. break;
  112. }
  113. }
  114. }
  115. /* Inserting in database */
  116. $connection = mysql_connect($this->host, $this->username, $this->password) or die(mysql_error());
  117. $query = "Insert into crm.leads (id, firstname, lastname, company) value ";
  118. for ($k = 0; $k < count($records); $k++) {
  119. if ($k == 0) {
  120. $query .= "('" . $records[$k]['LEADID'] . "','" . $records[$k]['First Name'] . "','" . $records[$k]['Last Name'] . "','" . $records[$k]['Company'] . "')";
  121. }
  122. if ($k > 0) {
  123. $query .= ", ('" . $records[$k]['LEADID'] . "','" . $records[$k]['First Name'] . "','" . $records[$k]['Last Name'] . "','" . $records[$k]['Company'] . "')";
  124. }
  125. }
  126. $result = mysql_query($query, $connection) or die(mysql_error());
  127. if (isset($result) && mysql_affected_rows($connection) == count($records)) {
  128. echo "Data's are inserted in database successfully.<br/><br/> ";
  129.  
  130. /* Table structure of inserted data, you can check inserted data by uncommenting a below section */
  131. /*
  132.   $insertedTable = "<table cellspacing=0 cellpadding='4px' border=1>";
  133.   $insertedTable .= "<tr><td>Lead ID</td><td>First Name</td><td>Last Name</td><td>Company</td></tr>";
  134.   for ($k = 0; $k < count($records); $k++) {
  135.   $insertedTable .= "<tr><td>" . $records[$k]['LEADID'] . "</td><td>" . $records[$k]['First Name'] . "</td><td>" . $records[$k]['Last Name'] . "</td><td>" . $records[$k]['Company'] . "</td></tr>";
  136.   }
  137.   $insertedTable .= "</table>";
  138.   echo $insertedTable;
  139.   */
  140. } else {
  141. echo 'Some error while inserting in database';
  142. }
  143. }
  144.  
  145. }
  146. ?>


Update...
Jak narazie to moge powiedzić że:
1) echo "Params: " . $parameter; zwraca paramery:

Params: scope=crmapi&authtoken=mojtokenautoruzacujnu&selectColumns=Leads(LEADID,First Name,Last Name,Company)
wiec ta część jast ok

2) pierwszy sposób który mi pozwala pobrać dane z CRM to metoda GET, natomiast użyte w skrypcie php curl to metoda POST. Raczej wątpie że to jest przyczyną bo skryp żywcem wzięty ze strony Zoho CRM....no ale może tu jest przyczyna?questionmark.gif z powodu braku zrozumienia składni:
  1. public function sendCurlRequest($url, $parameter) {
  2. try {
  3. /* initialize curl handle */
  4. $ch = curl_init();
  5. /* set url to send post request */
  6. curl_setopt($ch, CURLOPT_URL, $url);
  7. /* allow redirects */
  8. curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
  9. /* return a response into a variable */
  10. curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
  11. /* times out after 30s */
  12. curl_setopt($ch, CURLOPT_TIMEOUT, 30);
  13. /* set POST method */
  14. curl_setopt($ch, CURLOPT_POST, 1);
  15. /* add POST fields parameters */
  16. curl_setopt($ch, CURLOPT_POSTFIELDS, $parameter);
  17. /* execute the cURL */
  18. $result = curl_exec($ch);
  19. curl_close($ch);
  20. return $result;
  21. }

nie potrafię togo przerobić na curl metodą GET. Jak ktoś jest chętny to pomocy to sprawdzę. Moze tu jest przyczyna.
Dzieki.
lukasz_os
1. Parametry połącz & i dodaj do url.
2. Wywołaj ten url w curl_setopt($ch, CURLOPT_URL, $url);
3. Wykasuj odwołanie POSTA czyli: curl_setopt($ch, CURLOPT_POST, 1); oraz curl_setopt($ch, CURLOPT_POSTFIELDS, $parameter);

To wszystko smile.gif
pela222
Rozwiązaniem okazało się wyłączenie SSL

  1. public function sendCurlRequest($url, $parameter) {
  2. try {
  3. /* initialize curl handle */
  4. $ch = curl_init();
  5. /* set url to send post request */
  6. curl_setopt($ch, CURLOPT_URL, $url);
  7. /* allow redirects */
  8. curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
  9. /* return a response into a variable */
  10. curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
  11. curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);// Turn off the server and peer verification
  12. curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
  13. /* times out after 30s */
  14. curl_setopt($ch, CURLOPT_TIMEOUT, 30);
  15. /* set POST method */
  16. curl_setopt($ch, CURLOPT_POST, 1);
  17. /* add POST fields parameters */
  18. curl_setopt($ch, CURLOPT_POSTFIELDS, $parameter);
  19. /* execute the cURL */
  20. $result = curl_exec($ch);
  21. curl_close($ch);
  22. return $result;
  23. } catch (Exception $exception) {
  24. echo 'Exception Message: ' . $exception->getMessage() . '<br/>';
  25. echo 'Exception Trace: ' . $exception->getTraceAsString();
  26. }
  27. }


I wszystko gra smile.gif


EDIT - Nowy problem - mysql_real_escape_string
------------------------------------------
Hej,
teraz mam troche inny problem. Nie potrafie sobie poradzić z prawidłowym użyciem funkcji: mysql_real_escape_string (bo to chyba jest remedium na moj problem.

Jeden z rekordów ma apostrof Company = O'Brien Transport (może wiecej ma smile.gif ) i dostaje coś takiego:
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'Brien Transport','Truck Driver','','Marlena','Szczerba','Cleaning Contractors','' at line 1

Po wstawieniu:
  1. $query = mysql_real_escape_string($query);
dostaje:

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '\'624745000000615017\',\'Karol\',\'Czyjak\',\'Wall Steal Ltd\',\'CNC Operator\',' at line 1

Z tego co zrozumiałem czytając manual to powinienem tej funkcji użyć przed połączeniem z bazą i wtedy użyć funkcji takiej:
  1. $records = mysql_real_escape_string($records);

no ale zmienna records to jest tablica i tutaj leżę.

Kod poniżej (z wstawionym mysql_real_escape_string - które wywala błąd ale dodaje backslash co widać powyżej (co ciekawe inny klient - pewnie pierwszy z bazy)

  1. /* Inserting in database */
  2. $connection = mysql_connect($this->host, $this->username, $this->password) or die(mysql_error());
  3. $query = "replace into crm.leads (id, firstname, lastname, company, occupation, income, spousename, spouselastname, spousecompany, spouseoccupation, spouseincome, street, city, county) value ";
  4. for ($k = 0; $k < count($records); $k++) {
  5. if ($k == 0) {
  6. $query .= "('" . $records[$k]['CONTACTID'] . "','" . $records[$k]['First Name'] . "','" . $records[$k]['Last Name'] . "','" . $records[$k]['Company'] . "','" . $records[$k]['Occupation'] . "','" . $records[$k]['Income'] . "','" . $records[$k]['Spouse Name'] . "','" . $records[$k]['Spouse Last Name'] . "','" . $records[$k]['Spouse Company'] . "','" . $records[$k]['Spouse Occupation'] . "','" . $records[$k]['Spouse Income'] . "','" . $records[$k]['Street'] . "','" . $records[$k]['City'] . "','" . $records[$k]['County'] . "')";
  7. }
  8. if ($k > 0) {
  9. $query .= ", ('" . $records[$k]['CONTACTID'] . "','" . $records[$k]['First Name'] . "','" . $records[$k]['Last Name'] . "','" . $records[$k]['Company'] . "','" . $records[$k]['Occupation'] . "','" . $records[$k]['Income'] . "','" . $records[$k]['Spouse Name'] . "','" . $records[$k]['Spouse Last Name'] . "','" . $records[$k]['Spouse Company'] . "','" . $records[$k]['Spouse Occupation'] . "','" . $records[$k]['Spouse Income'] . "','" . $records[$k]['Street'] . "','" . $records[$k]['City'] . "','" . $records[$k]['County'] . "')";
  10. }
  11. }
  12. $query = mysql_real_escape_string($query);
  13. $result = mysql_query($query, $connection) or die(mysql_error());


EDIT .....
Nie wiem czy moje pytania są za trudne czy za łatwe?questionmark.gif Czy zbyt szczegółowo opisany problem (??wada??). Jak toś napisze nie wiem jak zrobić "coś tam coś tam .. pomóżcie" to są podpowiedzi? hmm...
nospor
Zamiast sie zalic na forum jak to masz trudno-latwe pytania lepiej bys zajrzal porzadnie do manuala. Tam dosc wyraznie jest napisane, ze mysql_real_escape_string masz uzywac na danych jakie wstawiasz do zapytania, a nie na calym zapytaniu....
pela222
Cytat(nospor @ 14.03.2014, 11:29:59 ) *
Tam dosc wyraznie jest napisane, ze mysql_real_escape_string masz uzywac na danych jakie wstawiasz do zapytania, a nie na calym zapytaniu....

Czyli że powinno byćquestionmark.gif? :

  1. $records = mysql_real_escape_string($records);


Tak??
Już to próbowałem i tak jak napisałem ponieważ to jest tablica to pewnie dla tego to mi nie działa. A jak zapytałem jak to zrobić dla tabilicy to pomocy brak.
Dzięki za info. Możesz rozwinać swoją myśl żeby mi pomóc.

co do manuala to już go czytałem i próbowałem użyć tego co tam jest napisne (włączając sekcję notes - bezskutecznie sad.gif ). Jakbym potrafił to bym nie pytał. Jakbym przesłał tobie książkę napisaną po chińsku to też by ci zajęło kilka miesięcy zanim byś zrozumiał pierwszą stronę ... czy nie?? Czy to oznacza że przez pierwszy miesiąc nie możesz poprosić kogoś kto zna chiński o pomoc? no bo jak tak to po co te wszystkie fora?
nospor
Kurcze.... prosilem, zajrzyj do manuala.... tam masz podane na przykladzie jak to zrobic. mysql_real_escape_string uzywa sie na danych a nie na tablicy z danymi. Rozrozniaj te dwie rzeczy



To jest twoja dana, ktora wkladasz do zapytania:
$records[$k]['First Name']

To na niej masz zrobic:
mysql_real_escape_string($records[$k]['First Name'])

Analogicznie na innych danych, ktore wkladasz do zapytania...

A tak pozatym to zainteresuj sie PDO lub mysqli_ oraz bindowaniem. mysql_ jest juz przestarzale i niedlugo wyleci z php

Cytat
akbym przesłał tobie książkę napisaną po chińsku to też by ci zajęło kilka miesięcy zanim byś zrozumiał pierwszą stronę ... czy nie?
Jakbym obok mial napisane po polsku to nie. W manualu masz wlasnie obok opis co i jak nalezy zrobic. tam nie ma chinszczyzny.
Jak masz napisane jak wol, ze funkcja przyjmuje STRING to masz tam wkladac STRING a nie tablice.
pela222
Cytat(nospor @ 14.03.2014, 12:34:40 ) *
To jest twoja dana, ktora wkladasz do zapytania:
$records[$k]['First Name']

To na niej masz zrobic:
mysql_real_escape_string($records[$k]['First Name'])


Czyli bedzie coś takeigo:
  1. /* Inserting in database */
  2. $connection = mysql_connect($this->host, $this->username, $this->password) or die(mysql_error());
  3. $query = "replace into crm.leads (id, firstname, lastname, dob, company, occupation, income, spousename, spouselastname, spousedob, spousecompany, spouseoccupation, spouseincome, street, city, county) value ";
  4. for ($k = 0; $k < count($records); $k++) {
  5. if ($k == 0) {
  6. $query .= "('" . $records[$k]['CONTACTID'] . "','" . $records[$k]['First Name'] . "','" . mysql_real_escape_string($records[$k]['Last Name']) . "','" . $records[$k]['Date of Birth'] . "','" . mysql_real_escape_string($records[$k]['Company']) . "','" . mysql_real_escape_string($records[$k]['Occupation']) . "','" . $records[$k]['Income'] . "','" . $records[$k]['Spouse Name'] . "','" . $records[$k]['Spouse Last Name'] . "','" . $records[$k]['Spouse DOB'] . "','" . mysql_real_escape_string($records[$k]['Spouse Company']) . "','" . $records[$k]['Spouse Occupation'] . "','" . $records[$k]['Spouse Income'] . "','" . $records[$k]['Street'] . "','" . $records[$k]['City'] . "','" . $records[$k]['County'] . "')";
  7. }
  8. if ($k > 0) {
  9. $query .= ", ('" . $records[$k]['CONTACTID'] . "','" . $records[$k]['First Name'] . "','" . mysql_real_escape_string($records[$k]['Last Name']) . "','" . $records[$k]['Date of Birth'] . "','" . mysql_real_escape_string($records[$k]['Company']) . "','" . mysql_real_escape_string($records[$k]['Occupation']) . "','" . $records[$k]['Income'] . "','" . $records[$k]['Spouse Name'] . "','" . $records[$k]['Spouse Last Name'] . "','" . $records[$k]['Spouse DOB'] . "','" . mysql_real_escape_string($records[$k]['Spouse Company']) . "','" . $records[$k]['Spouse Occupation'] . "','" . $records[$k]['Spouse Income'] . "','" . $records[$k]['Street'] . "','" . $records[$k]['City'] . "','" . $records[$k]['County'] . "')";
  10. }
  11. }
  12. $result = mysql_query($query, $connection) or die(mysql_error());
  13. if (isset($result) && mysql_affected_rows($connection) == count($records)) {
  14. echo "Data's are inserted in database successfully.<br/><br/> ";

Na razie dodałem tylko tam gdzie widzę że wywało bład. Potem uzupełnię wszędzie. Musze zobaczyć bo dostaje błąd:
Column count doesn't match value count at row 1
Ale chyba chodzi o to że nie mam jakiegoś pola w mysql.

Dzieki za pomoc.


EDIT----
Już poprawiłem jak wyżej i gra muzyka.
Jeszcze raz dzięki.
nospor
Wyszczegolniasz 16 pol, zas wartosci dodajesz tylko dla 15. Stad komunikat bledu

ps:
nie county a country. Taka literowka, ktora drazni oczy wink.gif
pela222
Cytat(nospor @ 14.03.2014, 13:01:52 ) *
ps:
nie county a country. Taka literowka, ktora drazni oczy wink.gif


Niestety w tym przypadku jednak nie miałeś racji smile.gif jednak county smile.gif bo nie zawsze można mieć rację..dzięki za czujność smile.gif
http://en.wikipedia.org/wiki/Counties_of_Ireland
ale jeszcze raz dzieki.smile.gif
nospor
Acha, czyli probujesz mi powiedziec, ze w bazie przechowujesz miasta i hrabstwa a nie miasta i kraje? No jesli tak, to faktycznie moja wina. smile.gif
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.