Database benaderen met JApplicationCli

  • Frits Jongbloets
  • Onderwerp Auteur
  • Gebruiker
  • Gebruiker
Meer
14 jan 2017 18:43 #11349 door Frits Jongbloets
Beantwoord door Frits Jongbloets in topic Database benaderen met JApplicationCli
Hi,

Heb deze code nog niet gecheckt, verwacht ook eigenlijk niet dat het veel gaat uitmaken. Ik heb in eerder al eens het $db object uitgelezen, op verschillende stappen tijdens het proces. Daarin zie ik na JFactory::getDbo() al keurig de benodigde configuratiegegevens verschijnen (host, user, password etc.) en na $db->setQuery($query) de query. Dus of we nu linksom of rechtsom gaan, er staan de juiste gegevens en query in. En toch krijgt hij de database niet te pakken. Daarbij proberen methodes als JFactory::getApplication() blijkbaar ook de database te benaderen en daarmee gaat het ook mis.

Vandaar mijn idee dat het ergens anders in moet zitten dan het stukje code waar we nu mee bezig zijn. Maar waarin dan wel?
Discussie gesloten.
  • J Sanders
  • Gebruiker
  • Gebruiker
  • Ontwikkelaar van [url=www.mijnrekensite.nl]MijnRekensite.nl[/url].
Meer
15 jan 2017 17:11 #11356 door J Sanders
Beantwoord door J Sanders in topic Database benaderen met JApplicationCli
Onderstaande code heb ik iets gewijzigd en uitgetest.
Je zult zien dat de databaseverbinding WEL werkt en de inhoud van het object met var_dump wordt uitgelezen. :D
Code:
public function execute() { $db = JFactory::getDbo(); $query = $db->getQuery(true) ->select('*') ->from($db->qn('#__content')); $db->setQuery($query); $results = $db->loadObjectList(); echo '<pre>'; var_dump($results); // test echo '</pre>'; if ($results) { // to do: create real output below $content = '<xml>'; foreach ($results as $result) { $content.= $result['title']; } $content .= '</xml>'; //echo 'Database found'; // test } else echo $content = 'No database found'; return $content; }

Er verschijnt nog wel de foutmelding: "Error displaying the error page: Application Instantiation Error: Cannot use object of type stdClass as array".
De foreach-lus kan op deze manier namelijk niet werken, omdat de variabele $results een speciaal object is. ;)

Gr.

Aanvulling: Wil je alleen de title uitlezen dan wijzigt het volgende:
Code:
->select('*')
in
Code:
->select('title')
en
Code:
$content.= $result['title'];
in
Code:
$content.= $result->title;

Ontwikkelaar van MijnRekensite.nl , een online oefenmethode voor rekenen.
Discussie gesloten.
  • Frits Jongbloets
  • Onderwerp Auteur
  • Gebruiker
  • Gebruiker
Meer
16 jan 2017 08:37 #11357 door Frits Jongbloets
Beantwoord door Frits Jongbloets in topic Database benaderen met JApplicationCli
Hoi @jedu# ,
Ik waardeer je hulp en je vasthoudendheid in deze kwestie, en heb je laatste code getest, maar... ook deze geeft weer die foutmelding:
Error displaying the error page: Application Instantiation Error: Could not connect to MySQL
Uitcommenten van de regel $results = $db->loadObjectList() zorgt dat de foutmelding verdwijnt, maar ja, dan hebben we ook geen content opgehaald.

En eigenlijk had ik dit verwacht. Ik denk niet dat het ligt aan jouw of mijn code, er is iets anders aan de hand, misschien iets met de JApplicationCli class, ik weet het niet. Ik heb nu een dump gemaakt van het database-object dat ontstaat met de laatste code van @jedu# , misschien zijn er mensen die hier iets uit kunnen opmaken. Ik heb alleen de database naam onleesbaar gemaakt omdat die te herleiden is naar de naam van de klant.
Code:
object(JDatabaseDriverMysqli)#15 (23) { ["name"]=> string(6) "mysqli" ["serverType"]=> string(5) "mysql" ["connection":protected]=> bool(false) ["nameQuote":protected]=> string(1) "`" ["nullDate":protected]=> string(19) "0000-00-00 00:00:00" ["_database":"JDatabaseDriver":private]=> string(13) "********" // hier staat de correcte databasenaam ["count":protected]=> int(0) ["cursor":protected]=> NULL ["debug":protected]=> bool(false) ["limit":protected]=> int(0) ["log":protected]=> array(0) { } ["timings":protected]=> array(0) { } ["callStacks":protected]=> array(0) { } ["offset":protected]=> int(0) ["options":protected]=> array(9) { ["driver"]=> string(6) "mysqli" ["host"]=> string(9) "localhost" ["user"]=> string(4) "root" ["password"]=> string(4) "root" ["database"]=> string(13) "********" // hier staat de correcte databasenaam ["prefix"]=> string(6) "adb01_" ["select"]=> bool(true) ["port"]=> int(8889) ["socket"]=> NULL } ["sql":protected]=> object(JDatabaseQueryMysqli)#20 (24) { ["offset":protected]=> int(0) ["limit":protected]=> int(0) ["db":protected]=> *RECURSION* ["sql":protected]=> NULL ["type":protected]=> string(6) "select" ["element":protected]=> NULL ["select":protected]=> object(JDatabaseQueryElement)#21 (3) { ["name":protected]=> string(6) "SELECT" ["elements":protected]=> array(1) { [0]=> string(1) "*" } ["glue":protected]=> string(1) "," } ["delete":protected]=> NULL ["update":protected]=> NULL ["insert":protected]=> NULL ["from":protected]=> object(JDatabaseQueryElement)#22 (3) { ["name":protected]=> string(4) "FROM" ["elements":protected]=> array(1) { [0]=> string(12) "`#__content`" } ["glue":protected]=> string(1) "," } ["join":protected]=> NULL ["set":protected]=> NULL ["where":protected]=> NULL ["group":protected]=> NULL ["having":protected]=> NULL ["columns":protected]=> NULL ["values":protected]=> NULL ["order":protected]=> NULL ["autoIncrementField":protected]=> NULL ["call":protected]=> NULL ["exec":protected]=> NULL ["union":protected]=> NULL ["unionAll":protected]=> NULL } ["tablePrefix":protected]=> string(6) "adb01_" ["utf":protected]=> bool(true) ["utf8mb4":protected]=> bool(false) ["errorNum":protected]=> int(0) ["errorMsg":protected]=> NULL ["transactionDepth":protected]=> int(0) ["disconnectHandlers":protected]=> array(0) { } }
Discussie gesloten.
  • J Sanders
  • Gebruiker
  • Gebruiker
  • Ontwikkelaar van [url=www.mijnrekensite.nl]MijnRekensite.nl[/url].
Meer
16 jan 2017 09:17 #11359 door J Sanders
Beantwoord door J Sanders in topic Database benaderen met JApplicationCli
Hoi,
Verander eens
Code:
$results = $db->loadObjectList();
in
Code:
$results = $db->loadAssocList();
Haal wel de // weg.
Werkt bij mij ook in combinatie met,
Code:
$content.= $result['title'];

Ter aanvulling:
De gebruikte code heb ik opgeslagen in het bestand: mydeamon.php (in de map cli) en roep ik op via een cronjob.

Ontwikkelaar van MijnRekensite.nl , een online oefenmethode voor rekenen.
Discussie gesloten.
  • Frits Jongbloets
  • Onderwerp Auteur
  • Gebruiker
  • Gebruiker
Meer
19 jan 2017 16:12 #11414 door Frits Jongbloets
Beantwoord door Frits Jongbloets in topic Database benaderen met JApplicationCli
Hoi,
Ik ben voor dit moment maar even overgestapt naar een generieke php methode om met de database te communiceren, en dat lukt wel. Hoop er ooit nog eens achter te komen waardoor het niet lukte met het Joomla db object, maar voor dit moment gaat resultaat even voor.

Het is iets als dit geworden, en dat werkt:
Code:
public function execute() { $content = ''; // getting some config settings $config = JFactory::getConfig(); $servername = $config->get('host'); $username = $config->get('user'); $password = $config->get('password'); $dbname = $config->get('db'); $dbprefix = $config->get('dbprefix'); // Create and check connection $conn = new mysqli($servername, $username, $password, $dbname); // Check connection if ($conn->connect_error) { $content = "Connection failed: " . $conn->connect_error; return $content; } $table = $dbprefix . 'content'; $sql = "SELECT * FROM $table"; $result = $conn->query($sql); if ($result->num_rows > 0) { // output data of each row while($row = $result->fetch_assoc()) { $content.= $row['title']. ' '; } } else { echo "0 results"; } $conn->close(); return $content; }

Bedankt voor het meedenken!
Discussie gesloten.
  • J Sanders
  • Gebruiker
  • Gebruiker
  • Ontwikkelaar van [url=www.mijnrekensite.nl]MijnRekensite.nl[/url].
Meer
19 jan 2017 19:44 #11415 door J Sanders
Beantwoord door J Sanders in topic Database benaderen met JApplicationCli
Mooi, dat het je uiteindelijk toch gelukt is. :D

Toch jammer dat je de 'oorzaak' niet hebt kunnen achterhalen! :o
Rest mij om te vragen of je
Code:
$results = $db->loadAssocList();
hebt getest in combinatie met
Code:
$content.= $result['title'];
?
Gr

Ontwikkelaar van MijnRekensite.nl , een online oefenmethode voor rekenen.
Discussie gesloten.
  • Sander Potjer
  • Gebruiker
  • Gebruiker
  • Sander is voorzitter van Stichting Joomla Nederland, de stichting voor de promotie en ondersteuning
Meer
20 jan 2017 07:28 #11418 door Sander Potjer
Beantwoord door Sander Potjer in topic Database benaderen met JApplicationCli
@jedu# zoals door @oorzaak# aangegeven zit het echt niet in de verdere bewerking van de resultaten uit de database query, dan krijg je namelijk een hele andere foutmelding. Het voorbeeld script dat hier eerder is geplaatst geeft bij mij gewoon resultaat (al geeft de verdere bewerking dan inderdaad errors), maar feit is dus dat er op een of andere manier bij het aanroepen van de database al wat mis gaat dat waarschijnlijk veroorzaakt wordt door iets bij de omgeving waar het wordt uitgevoerd, want hier heb ik lokaal het probleem niet met dezelfde code.

Joomla! ontwikkelaar @ Perfect Web Team - perfectwebteam.nl
PWT ACL voor Joomla maakt ACL in Joomla begrijpelijk! - [url=https://extensions.perfectwebteam.com/pwt
Discussie gesloten.
  • J Sanders
  • Gebruiker
  • Gebruiker
  • Ontwikkelaar van [url=www.mijnrekensite.nl]MijnRekensite.nl[/url].
Meer
20 jan 2017 11:34 #11421 door J Sanders
Beantwoord door J Sanders in topic Database benaderen met JApplicationCli
Sander, bedankt voor de tip. Maar dit was mij al bekend. :D

Ontwikkelaar van MijnRekensite.nl , een online oefenmethode voor rekenen.
Discussie gesloten.
Gemaakt door Kunena