Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien

[PHP] Probleem? Wat doe ik fout

Pagina: 1
Acties:

  • GAITii
  • Registratie: December 2008
  • Laatst online: 22-11 23:03
Hallo Tweakers,

Momenteel zit ik met een probleempje waar ik met mijn mindere PHP kennis niet uit kom.

Om maar meteen met de deur in huis te vallen:

PHP:
1
2
3
4
5
6
7
8
9
10
11
<?php
exec('ls -ls', $output);


echo '<table>';
foreach($output as $iets)
{
    echo '<tr><td>'.$iets.'</td></tr>';
}
echo '</table>';
?>


Dit werkt helemaal goed en zoals het hoort, krijg netjes een tabel met op elke regel een mapje/bestandje.

Alleen omdat ik graag commands op afstand wil opvragen d.m.v. SSH krijg ik niets terug, dit doe ik als volgt:

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<?php
include('Net/SSH2.php');

$ssh = new Net_SSH2('ip');
if (!$ssh->login('username', 'password')) {
    exit('Login Failed');
}

$ssh->exec('ls -ls', $output);


echo '<table>';
foreach($output as $iets)
{
    echo '<tr><td>'.$iets.'</td></tr>';
}
echo '</table>';
?>


Helaas krijg ik hier geen output uit. Wanneer ik het volgende doe weer wel:

PHP:
1
2
3
4
5
6
7
8
9
10
<?php
include('Net/SSH2.php');

$ssh = new Net_SSH2('ip');
if (!$ssh->login('username', 'password')) {
    exit('Login Failed');
}

echo $ssh->exec('ls -ls');
?>


Ik gebruik hiervoor verder het phpseclib systeem. En ik denk dat ik iets heel simpels verkeerds doe alleen kan ik er maar niet op komen.

Iemand enig idee hoe of wat het wel zit?

Steam: GAITii | PSN: GAITii | 3DS FC: 0361-7487-5231


  • ByteMe_
  • Registratie: Januari 2009
  • Niet online
En wat geeft:
code:
1
print_r($output);

[ Voor 176% gewijzigd door ByteMe_ op 19-11-2013 15:32 ]

Mijn laatste reviews: Xiaomi Mi 9T | Mpow H12


  • EddoH
  • Registratie: Maart 2009
  • Niet online

EddoH

Backpfeifengesicht

Volgens mij geeft de Net_SSH2 exec de output gewoon als return value (zoals je bij je echo al ziet). Wat is nu precies het probleem? In plaats van dat je $output als 2e argument aan de exec call geeft, doe je gewoon
PHP:
1
$output = $ssh-exec(bla);


Zie: http://phpseclib.sourcefo....html#net_ssh_interactive

  • GAITii
  • Registratie: December 2008
  • Laatst online: 22-11 23:03
Wanneer ik dit doe:

PHP:
1
2
3
4
5
6
7
8
$output = $ssh->exec('ls -ls');

echo '<table>';
foreach($output as $iets)
{
    echo '<tr><td>'.$iets.'</td></tr>';
}
echo '</table>';


Krijg ik geen output...

En wil dit straks graag gaan doen met bepaalde lijsten en die wil ik dan netjes laten weergeven in een tabel en dus niet alle gegevens in 1 TD.

Steam: GAITii | PSN: GAITii | 3DS FC: 0361-7487-5231


  • Sleepkever
  • Registratie: Juni 2007
  • Laatst online: 22-11 00:12
Waarom TD's en geen divs, maar dat is een andere discussie.

Even een zet in de juiste richting, foreach werkt alleen op arrays, die string die je terug krijgt valt niet overheen te loopen, het is geen array immers (als je warnings aan had staan had je dit ook gezien waarschijnlijk).
Ofwel, je zou je string eerst kunnen splitten in een string array op de newline (\n) doormiddel van explode, en dan over de array loopen. Of je kan gewoon netjes newline vervangen door <br> (nl2br() ) en het op die manier weergeven.

Overgens kan je in de toekomst de type van een variable achterhalen door even var_dump($output) te doen, dan zul je zien dat in dit geval de output waarschijnlijk geen array is.

  • Caelorum
  • Registratie: April 2005
  • Laatst online: 14:18
Sleepkever schreef op dinsdag 19 november 2013 @ 15:29:
Waarom TD's en geen divs, maar dat is een andere discussie. [...]
Een foreach doet mij toch vermoeden dat een list of een table meer geschikt is. Je enumeert over iets dat blijkbaar met elkaar te maken heeft. Dan gebruik je dus een list in het geval van data met een enkel veld (1 kolom) en een table in het geval van meervoudige velden (2+ kolommen), toch?

  • GAITii
  • Registratie: December 2008
  • Laatst online: 22-11 23:03
Zou je mij dan kunnen vertellen hoe het er dan uit komt te zien? Wanneer ik een simpele userlist van iets opvraag krijg ik alle users naast elkaar dus bijvoorbeeld:

jan piet etc etc etc...

Steam: GAITii | PSN: GAITii | 3DS FC: 0361-7487-5231


  • Sleepkever
  • Registratie: Juni 2007
  • Laatst online: 22-11 00:12
Als ik alles ga voor zitten kauwen leer je er zelf niets van.

Stappenplannetje dan maar.
Pak de output van je SSH, dit is een string
Haal die output door explode() heen, gesplitst op het character '\n' (\n is het character voor een nieuwe regel). Hier krijg je dan een array van strings terug.
Die array die je dan hebt kan je dan door de foreach heen halen zoals je al had. Enige wat je eigenlijk toe moet voegen is die explode() in een nieuwe variable en je foreach daar overheen laten stappen ipv over je string.

  • GAITii
  • Registratie: December 2008
  • Laatst online: 22-11 23:03
Klopt daar heb je gelijk in.

Ik heb de explode er nu tussenin zitten alleen nog krijg ik onderaan de tabel een lege TD zeg maar...

Steam: GAITii | PSN: GAITii | 3DS FC: 0361-7487-5231


  • Sleepkever
  • Registratie: Juni 2007
  • Laatst online: 22-11 00:12
Nou, tijd om te debuggen dan. Ga voor de gein eens kijken wat er in de variable zit wat je in de foreach loop stopt met echo of var_dump. Kijk of daar wel uitkomt wat je verwacht. En post even de huidige code met de output van de var_dump hier als dat niet de oplossing bied.

  • Morrar
  • Registratie: Juni 2002
  • Laatst online: 21-11 21:44
De lege TD komt omdat de output waarschijnlijk een extra \n aan het einde heeft. Even trimmen dus voordat je explode() er overheen knalt?

[ Voor 16% gewijzigd door Morrar op 19-11-2013 16:15 ]


  • Exception
  • Registratie: Augustus 2006
  • Laatst online: 07:10
Sleepkever schreef op dinsdag 19 november 2013 @ 15:29:
Waarom TD's en geen divs, maar dat is een andere discussie.
offtopic:
Hij gebruikt een tabel waar een tabel voor bedoelt is. Naar mijn mening is hier niets mis mee...

  • Sleepkever
  • Registratie: Juni 2007
  • Laatst online: 22-11 00:12
offtopic:
Een tabel met een kolom is nauwelijks gestructureerde data te noemen. Dat je de output netjes op meerdere regels wilt hebben kan makkelijk met pre of br gedaan worden, een tabel met een kolom gebruiken is wellicht overkill. De suggestie van div is ook niet de handigste in deze situatie overigens. Zodra er meer dan een kolom zou zijn in de data dan zou ik het overigens compleet met je eens zijn.

  • GAITii
  • Registratie: December 2008
  • Laatst online: 22-11 23:03
Ik heb nu dit:

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
$ssh = new Net_SSH2('ip');
if (!$ssh->login('username', 'password')) {
    exit('Login Failed');
}

$cmdUsername = $ssh->exec('zarafa-stats --users | grep 0x6701001E | awk -F": " \'{print $2}\'');
$cmdFullname = $ssh->exec('zarafa-stats --users | grep 0x3001001E | awk -F": " \'{print $2}\'');
$cmdEmailAddress = $ssh->exec('zarafa-stats --users | grep 0x39FE001E | awk -F": " \'{print $2}\'');
$cmdAdministrator = $ssh->exec('zarafa-stats --users | grep 0x67B10003 | awk -F": " \'{print $2}\'');

$getUsername = explode("\n", trim($cmdUsername));
$getFullname = explode("\n", trim($cmdFullname));
$getEmailAddress = explode("\n", trim($cmdEmailAddress));
$getAdministrator = explode("\n", trim($cmdAdministrator));

echo '<table border=1>';
foreach($getUsername as $exec => $cmdExec) {
    echo '<tr>';
        echo '<td><a href="index.php?page=user_edit&user='.$getUsername[$exec].'">'.$getUsername[$exec].'</a></td> <td>'.$getFullname[$exec].'</td> <td>'.$getEmailAddress[$exec].'</td> <td>Administrator</td>';
    }
    echo '</tr>';
}
echo '</table>';


Dit werkt wel. Alleen voor mijn gevoel doe ik iets omslachtigs en moet dit korter kunnen volgens mij? Zit ik juist of is het een 'goede manier'?

Steam: GAITii | PSN: GAITii | 3DS FC: 0361-7487-5231


  • ByteMe_
  • Registratie: Januari 2009
  • Niet online
Je zet de table row in de foreach en je sluit af daarbuiten(ik zie trouwens 2 afsluitende brackets? Krijg je geen 'unexpected }' error?). Dat is al 1 omslachtig punt als het de bedoeling is om binnen je foreach die row te zetten.

Doe dan dit zoals je eerder al deed:

code:
1
echo '<tr><td><a href="index.php?page=user_edit&user='.$getUsername[$exec].'">'.$getUsername[$exec].'</a></td> <td>'.$getFullname[$exec].'</td> <td>'.$getEmailAddress[$exec].'</td> <td>Administrator</td></tr>';

[ Voor 3% gewijzigd door ByteMe_ op 20-11-2013 12:43 ]

Mijn laatste reviews: Xiaomi Mi 9T | Mpow H12


  • GAITii
  • Registratie: December 2008
  • Laatst online: 22-11 23:03
Ja oeps dat was een foutje, was wat aan het knippen geweest e.d.

Het gaat me vooral om dit stuk:

PHP:
1
2
3
4
5
6
7
8
9
$cmdUsername = $ssh->exec('zarafa-stats --users | grep 0x6701001E | awk -F": " \'{print $2}\''); 
$cmdFullname = $ssh->exec('zarafa-stats --users | grep 0x3001001E | awk -F": " \'{print $2}\''); 
$cmdEmailAddress = $ssh->exec('zarafa-stats --users | grep 0x39FE001E | awk -F": " \'{print $2}\''); 
$cmdAdministrator = $ssh->exec('zarafa-stats --users | grep 0x67B10003 | awk -F": " \'{print $2}\''); 

$getUsername = explode("\n", trim($cmdUsername)); 
$getFullname = explode("\n", trim($cmdFullname)); 
$getEmailAddress = explode("\n", trim($cmdEmailAddress)); 
$getAdministrator = explode("\n", trim($cmdAdministrator));

Steam: GAITii | PSN: GAITii | 3DS FC: 0361-7487-5231


  • Full_hyperion
  • Registratie: Februari 2003
  • Laatst online: 10-11 12:49
Je kan natuurlijk een functie schrijven:

PHP:
1
2
3
4
5
6
7
8
9
10
11
<?php

function getData($grepValue) {
    $cmdOutput = $ssh->exec('zarafa-stats --users | grep ' . $grepValue . ' | awk -F": " \'{print $2}\'');  
    return explode("\n", trim($cmdOutput));  
}

$getUsername = getData('0x6701001E'); 
// etc...

?>


Zorg er wel voor dat je duidelijke functie en variabele namen gebruikt. Ik weet niet wat je aan het doen bent, dus kan er ook geen goede namen bij verzinnen.

[ Voor 19% gewijzigd door Full_hyperion op 20-11-2013 13:42 ]


  • GAITii
  • Registratie: December 2008
  • Laatst online: 22-11 23:03
Dankje, haha, die functie is inderdaad handig!

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
function getData($grepValue) {
    global $ssh;

    $cmdOutput = $ssh->exec('zarafa-stats --users | grep '.$grepValue.' | awk -F": " \'{print $2}\'');   
    return explode("\n", trim($cmdOutput));   
}

$cmd = array('getUsername' => getData('0x6701001E'),
                'getFullname' => getData('0x3001001E'));

var_dump($cmd);          
            
echo '<table border=1>';
foreach($cmd as $info) {
    echo '<tr>';
        echo '<td>'.$info['getUsername'].'</td><td>'.$info['getFullname'].'</td>';
    echo '</tr>';
}
echo '</table>';


de var_dump geeft netjes de gehele array weer. Alleen volgens mij gaat er nu weer wat fout in de foreach?

Steam: GAITii | PSN: GAITii | 3DS FC: 0361-7487-5231


  • ByteMe_
  • Registratie: Januari 2009
  • Niet online
De output geeft dus iets vergelijkbaars als dit:

code:
1
2
3
4
5
6
7
8
9
10
array(4) {
  [0]=>
  string(3) "foo"
  [1]=>
  string(3) "bar"
  [2]=>
  string(5) "hello"
  [3]=>
  string(5) "world"
}


oftewel, wat mis je in je foreach regel? Hint 0,1,2,3

[ Voor 3% gewijzigd door ByteMe_ op 20-11-2013 16:27 ]

Mijn laatste reviews: Xiaomi Mi 9T | Mpow H12


  • GAITii
  • Registratie: December 2008
  • Laatst online: 22-11 23:03
De output van var_dump($cmd); is dit:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
array(2) { 
    ["getUsername"]=> array(4) {
        [0]=> string(5) "user1" 
        [1]=> string(6) "user2" 
        [2]=> string(4) "user3" 
        [3]=> string(6) "user4" 
    } 
        ["getFullname"]=> array(4) { 
        [0]=> string(13) "User 1" 
        [1]=> string(14) "User 2" 
        [2]=> string(4) "User 3" 
        [3]=> string(6) "User 4" 
    }
}

:9
D.m.v. die foreach zou ik het toch mooi in een tabelletje moeten krijgen? Alleen die is leeg... *zucht*

[ Voor 4% gewijzigd door GAITii op 20-11-2013 16:41 ]

Steam: GAITii | PSN: GAITii | 3DS FC: 0361-7487-5231


  • 8088
  • Registratie: December 2000
  • Niet online

8088

NaN

Door middel van die foreach zou je waarschuwingen in een tabelletje moeten krijgen. Om Sleepkever te citeren:
als je warnings aan had staan had je dit ook gezien waarschijnlijk

Do you seek to engage in or have you ever engaged in terrorist activities, espionage, sabotage, or genocide?


  • GAITii
  • Registratie: December 2008
  • Laatst online: 22-11 23:03
Errors aan geeft het volgende resultaat:
code:
1
Notice: Undefined index: getUsername in test.php on line 31


Het scriptje is nu als volgt:

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
function getData($grepValue) {
    global $ssh;

    $cmdOutput = $ssh->exec('zarafa-stats --users | grep '.$grepValue.' | awk -F": " \'{print $2}\'');   
    return explode("\n", trim($cmdOutput));   
}

$cmd = array('getUsername' => getData('0x6701001E'),
             'getFullname' => getData('0x3001001E'));        
            
echo '<table border=1>';
foreach($cmd as $info) {
    echo '<tr>';
        echo '<td>'.$info['getUsername'].'</td><td>'.$info['getFullname'].'</td>';
    echo '</tr>';
}
echo '</table>';


Lijkt me toch dat het zou moeten werken... :/

[ Voor 104% gewijzigd door GAITii op 20-11-2013 17:07 ]

Steam: GAITii | PSN: GAITii | 3DS FC: 0361-7487-5231


  • ByteMe_
  • Registratie: Januari 2009
  • Niet online
En wat kan je daaruit opmaken? Eigenlijk zou je dat niet hoeven vragen. Lees goed in je code

[ Voor 12% gewijzigd door ByteMe_ op 20-11-2013 17:03 ]

Mijn laatste reviews: Xiaomi Mi 9T | Mpow H12


  • GAITii
  • Registratie: December 2008
  • Laatst online: 22-11 23:03
Ronald, ik heb mijn code al aangepast daarop... zie post boven je :)

Steam: GAITii | PSN: GAITii | 3DS FC: 0361-7487-5231


  • 8088
  • Registratie: December 2000
  • Niet online

8088

NaN

Dat zal natuurlijk dezelfde notice opleveren. Dit kan best een leuke oefening zijn om arrays te leren begrijpen, maar waarom spreek je Zarafa's eigen API niet aan?

Do you seek to engage in or have you ever engaged in terrorist activities, espionage, sabotage, or genocide?


  • GAITii
  • Registratie: December 2008
  • Laatst online: 22-11 23:03
Omdat die geen dingen kan als Send As regels beheren e.d., en voor Zarafa heb je bij bepaalde Linux distro's ook een Linux user op de achtergrond nodig. Vandaar de weg via SSH. Alleen het creeren van overzichten als dit zit mijn nog dwars. Verder heb ik bijna alles al.

Steam: GAITii | PSN: GAITii | 3DS FC: 0361-7487-5231


  • NMe
  • Registratie: Februari 2004
  • Laatst online: 20-11 11:59

NMe

Quia Ego Sic Dico.

Je hebt een array dat er zo uitziet:
Array(
    'getUsername' => getData('0x6701001E'),
    'getFullname' => getData('0x3001001E')
)

Twee rijen dus, met elk een key (getUsername/getFullname) en een value (whatever die functies returnen). Vervolgens ga je er met foreach doorheen waarbij je de value wel toekent maar de key niet. En daarna probeer je die waarde weer aan te spreken alsof hij het originele array was. Lees voor de gein de documentatie van foreach eens door.

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


  • chaozz
  • Registratie: Juni 2000
  • Laatst online: 12-11 15:11

chaozz

Retrofiel

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<?php 
function getData($grepValue) { 
    global $ssh; 

    $cmdOutput = $ssh->exec('zarafa-stats --users | grep '.$grepValue.' | awk -F": " \'{print $2}\'');    
    return explode("\n", trim($cmdOutput));    
} 

$cmd = array('getUsername' => getData('0x6701001E'), 
             'getFullname' => getData('0x3001001E'));          
             
echo '<table border=1><tr>'; 
foreach($cmd as $k => $v) { 
    echo '<td>'.$cmd[$k].'</td>; // of echo hier gewoon $v
} 
echo '</tr></table>'; 
?>

chaozz.nl | RetroGameCouch


  • Morrar
  • Registratie: Juni 2002
  • Laatst online: 21-11 21:44
Het probleem is dat de functie ook weer een array retourneert, dus daar moet je ook overheen lopen. De data structuur is dus:

Array(
    'getUsername' => Array( 'Username1',
                            'Username2',
                            'Etc'
                           )
    'getFullname' => Array( 'Fullname1',
                            'Fullname2',
                            'Etc'
                           )
)

Als ik dan kijk wat je uiteindelijk wilt printen, lijkt het me niet handig om dit zo in een array te proppen... Eerlijk gezegd zou ik het gewoon zo doen:


PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
function getData($grepValue) { 
    global $ssh; 

    $cmdOutput = $ssh->exec('zarafa-stats --users | grep '.$grepValue.' | awk -F": " \'{print $2}\'');    
    return explode("\n", trim($cmdOutput));    
}  

//get names and fullnames
$names = getData('0x6701001E');
$fnames = getData('0x3001001E');    

//create output
echo '<table class="usertable"><tr><th>Username</th><th>Full name</th></tr>';
for($i = 0; $i < count($names); $i++) {
    echo '<tr><td>', $names[$i], '</td><td>', $fnames[$i], '</td></tr>';
} 
echo '</table>';

Enige aanname die je daarbij maakt is dat er evenveel names als full names zijn en dat ze in dezelfde volgorde geretourneerd worden. Als dat niet het geval is, heb je wat meer werk te verzetten...

[ Voor 46% gewijzigd door Morrar op 21-11-2013 10:33 ]


  • GAITii
  • Registratie: December 2008
  • Laatst online: 22-11 23:03
Ik heb het inderdaad opgelost door maar het script van Morrar te nemen, iedereen bedankt voor het meedenken!

Steam: GAITii | PSN: GAITii | 3DS FC: 0361-7487-5231


  • NMe
  • Registratie: Februari 2004
  • Laatst online: 20-11 11:59

NMe

Quia Ego Sic Dico.

....maar begrijp je ook waarom dat wél werkt en jouw code niet?

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.

Pagina: 1