Hoi guyz,

soms zie je door het bomen het bos niet meer.... en als je zoekt op wat je denkt nodig te heb verzuip je in alle goede bedoelde antwoorden en komt je verder en verder van de oorspronkelijke vraag weg. Zo ook heb ik het dit keer met de SUBSTR. Waar ik naar op zoek vind (maar niet kan vinden van de overweldigende repsonses weet je niet wat de juiste is).. Ik wil gedeelte van string die tussen twee gelijke karakters staan halen.

Laten we zeggen dat dit de string is : Level 1:Level 2:Level 3:Level 4:Level 5

Nu heb ik alleen Level 2 nodig. Zou een stuk eenvoudiger zijn als de lengtes van de levels gelijk waren. Dan zou kan ik een begin positie opgeven en de lengte maar dat is dus niet zo.. De lengte varieert dus.

De string is een waarde van een veld.

ik had ongeveer het volgende bedacht om te gebruiken :


SUBSTR(Z_ORG_DN, CHARINDEX(':', Z_ORG_DN) + 1, LEN(Z_ORG_DN)) AS Divisie


Maar dat werkt dus niet.. Krijg dan de foutmelding: Warning: mysqli_num_rows() expects parameter 1 to be mysqli_result, boolean given in


Mijn volledige code is:

<?php
				$sqlUitlezen = mysqli_query($connection, 
				$sql = "SELECT 	
				idm_doelsysteem.MSKEYVALUE_DOELSYSTEEM,
				idm_doelsysteem.ABC_PLATFORM,
				idm_doelsysteem.ABC_DOMAIN,
				idm_doelsysteem.ABC_REF_OU,
				idm_doelsysteem.ABC_AUT_DEFAULT_OWNER,
				idm_doelsysteem.Z_SYSTEM_RECONCILE_SOLL_ACCOUNTS,
				idm_doelsysteem.Z_SYSTEM_RECONCILE_REMOVE_IST_ASSIGNMENTS,
				idm_doelsysteem.Z_SYSTEM_RECONCILE_TIMESTAMP,
				idm_ou.MSKEYVALUE_OU,
				idm_ou.DISPLAYNAME,
				
				SUBSTR(idm_ou.Z_ORG_DN, CHARINDEX(':', idm_ou.Z_ORG_DN) + 1, LEN(idm_ou.Z_ORG_DN)) AS Divisie

				FROM idm_doelsysteem

				INNER JOIN `idm_ou` ON idm_doelsysteem.ABC_REF_OU = idm_ou.MSKEYVALUE_OU

				ORDER BY idm_doelsysteem.ABC_REF_OU ASC");

				$sqlAantal = mysqli_num_rows($sqlUitlezen);

				echo '<table border="0" rules="rows">';
				echo '  <tr>';
				echo '	<td colspan="12"><font size="5">Doelsystemen</font></td>';
				echo '  </tr>';
				echo '<tr>';
				echo '<td><h6><b>UNIEK KENMERK</b></h6></td>';
				echo '<td>&nbsp;</td>';
				echo '<td><h6><b>PLATFORM</b></h6></td>';
				echo '<td>&nbsp;</td>';
				echo '<td><h6><b>DOMEIN</b></h6></td>';
				echo '<td>&nbsp;</td>';
				echo '<td><h6><b>DIVISIE EIGENAAR</b></h6></td>';
				

				if ($sqlAantal > 0){

				while ($sqlData = mysqli_fetch_assoc($sqlUitlezen)){
				echo '<tr>';
				echo '<td><h6>'.$sqlData['MSKEYVALUE_DOELSYSTEEM'].'</h6></td>';
				echo '<td>&nbsp;</td>';
				echo '<td><h6>'.$sqlData['ABC_PLATFORM'].'</h6></td>';
				echo '<td>&nbsp;</td>';
				echo '<td><h6>'.$sqlData['ABC_DOMAIN'].'</h6></td>';
				echo '<td>&nbsp;</td>';
				echo '<td><h6>'.$sqlData['DISPLAYNAME'].' ('.$sqlData['ABC_REF_OU'].')</h6></td>';
				echo '</tr>';
				}
				echo '</table>';
				echo '<hr style="margin:5px 0 5px 0;">';
				echo '<h5>Ik heb '.$sqlAantal.' doelsystemen gevonden die op IDM zijn aangesloten</h5>';
				}else{
					echo '<center><a href="javascript:javascript:history.go(-1)"><img src="../img/no-data.png"></a></center>';
				}
			?>


Ben in deze ook even de klust aan het kwijtraken.
Brengt dit je op een idee?

<?php

$str = 'Level 1:Level 2:Level 3:Level 4:Level 5';

echo $str . '<br />';

$levels = array();

$levels = explode( ':', $str );

echo '<pre>' . print_r( $levels , TRUE ) . '</pre>';

?>
En als je zulke errors krijgt:

Warning: mysqli_num_rows() expects parameter 1 to be mysqli_result, boolean given in

.. dan is enige foutafhandeling met mysqli_error(..) zeker wel prettig.

En nog een tip: echo-putten met lappen HTML kan je ook omzeilen door dit buiten een PHP-blok te plaatsen, en de variabelen en constantes even tussen PHP-tags te plaatsen.
Adoptive Solution op 11/08/2019 15:47:14

Brengt dit je op een idee?

<?php

$str = 'Level 1:Level 2:Level 3:Level 4:Level 5';

echo $str . '<br />';

$levels = array();

$levels = explode( ':', $str );

echo '<pre>' . print_r( $levels , TRUE ) . '</pre>';

?>




hoi Adoptive Solution,

Dit kwam ik inderdaad ook al tegen in een eerdere post.. maar kwam er niet meer uit.
Leuk dat alle levels dan onder elkaar worden weergegeven maar is niet helemaal wat ik zoek.

Ik hoef alleen Level 2 te echoën.... de overige levels mogen in dit geval komen te vervallen. en dat is niet wat me tot nu toe gelukt is... zal wel eenvoudig zijn.. Maar is dit niet alles met wat je weet ;-)



[size=xsmall]Toevoeging op 11/08/2019 16:07:02:[/size]

- Ariën - op 11/08/2019 15:57:13

En als je zulke errors krijgt:

Warning: mysqli_num_rows() expects parameter 1 to be mysqli_result, boolean given in

.. dan is enige foutafhandeling met mysqli_error(..) zeker wel prettig.

En nog een tip: echo-putten met lappen HTML kan je ook omzeilen door dit buiten een PHP-blok te plaatsen, en de variabelen en constantes even tussen PHP-tags te plaatsen.





wat is een echo-put?????
ik ken er maar eentje en als je daar in roep "Hoe heet de koning van wezel......" ;-)
Dat is hetzelfde als lijn 25 t/m 54. ;-)

Verder kan je met $levels[1] je tweede element met Level 2 oproepen. Die print_r() is overigens puur voor testen bedoeld om je boom van je array te bekijken.
Je kunt het op 2 manieren doen:

Direct in de SQL query:

  SUBSTRING_INDEX(SUBSTRING_INDEX(idm_ou.Z_ORG_DN,':',2),':',-1) AS Divisie

(eerst knippen tot de 2e ':', dan alleen het stuk vanaf de laatste ':' = enkel het 2e level)

Of achteraf in de PHP (ala oplossing Adaptive):

  $divisie = explode(';',$sqlData['Z_ORG_DN'])[1] ?? null;

(index 1 = 2e level; die "?? null" zorgt ervoor dat er geen foutmelding komt als er minder dan 2 levels zijn)
Thnx Rob.... die Explode variant, zal ik vermoedelijk wel iets niet goed mee doen... ongetwijfeld.. Maar daar krijg ik geen resulaat.. Geen foutmelding maar ook geen waardes..

Die SUBSTRING opnemen in mijn SQL query levert precies op wat ik nodig heb. Mijn dank ik wederom groot..


Complmenten naar jullie allemaal hoor dat jullie dit allemaal kunnen bedenken zeg :-) of is dit gewoon 'n kwestie van vlieguren?
Rob Doemaarwat op 11/08/2019 16:14:49

Of achteraf in de PHP (ala oplossing Adaptive):

  $divisie = explode(';',$sqlData['Z_ORG_DN'])[1] ?? null;


Dirk Huizinga op 11/08/2019 16:41:30

Thnx Rob.... die Explode variant, zal ik vermoedelijk wel iets niet goed mee doen... ongetwijfeld.. Maar daar krijg ik geen resulaat.. Geen foutmelding maar ook geen waardes..


Bij Rob zal ';' wel ':' moeten zijn.
Huh?
Klopt... tikfoutje die puntkomma (;) moet inderdaad een dubbbel punt (:) zijn...
beide methodieken werken

Reageren