Help.... PHP Eval en STR_replace

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ik ben al heel lang bezig dit voor elkaar te krijgen maar het wil maar niet lukken.
Misschien dat iemand mij een stapje op weg kan helpen.

Het gaat om het volgende probleem:

Ik wil graag eval gebruiken maar die string bevat html opmaak ( dit kan dus niet )

Ik heb $get['sortlist_field_data'] en deze bevat:
$data['user_name'],$data['user_full_name'],$data['user_back_name']

deze zijn allen gescheiden met een ,

Deze splits ik op door middel van het volgende stukje code:
PHP:
1
$row = '<td>'.str_replace(',','</td><td>',$get['sortlist_field_data']).'</td>';


Nu heb ik voor elk record een <td></td> om mijn output heen.
Maar de php komt uit de database en moet dus met eval omgezet worden.

daarvoor gebruik ik:
PHP:
1
2
$row = 'echo '.str_replace(',','echo ',$get['sortlist_field_data']).'';
echo eval($row);


Maar dan zit er geen <td></td> omheen
Nou probeerde ik dus het volgende:

PHP:
1
2
3
$row = 'echo '.str_replace(',','echo ',$get['sortlist_field_data']).'';
$rows = '<td>'.str_replace(';',';</td><td>',eval($row)).'</td>';
echo $rows;


Maar dan krijg ik dus geen resultaat.
Als ik naar de code kijk ziet het er ook niet echt logisch uit misschien is er wel een veel makkelijkere oplossing maar ik zit vast dus misschien kan iemand mij helpen?

Acties:
  • 0 Henk 'm!

  • robbert
  • Registratie: April 2002
  • Laatst online: 11:40
bah, eval is vies :) Probeer dat nooit te gebruiken tenzij je echt niet zonder kan (en je kan vrijwel altijd zonder). En php code in een relationele database opslaan is nog viezer...

Zou je toevallig eens duidelijk uit kunnen leggen wat je precies van plan bent, want ik snap er niks van.

[ Voor 39% gewijzigd door robbert op 04-03-2008 18:58 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
robbert schreef op dinsdag 04 maart 2008 @ 18:56:
bah, eval is vies :) Probeer dat nooit te gebruiken tenzij je echt niet zonder kan (en je kan vrijwel altijd zonder). En php code in een relationele database opslaan is nog viezer...

Zou je toevallig eens duidelijk uit kunnen leggen wat je precies van plan bent, want ik snap er niks van.
Ik ben bezig met sorteerlijsten die je kunt opslaan dmv een form.
(In dit form kun je de database velden kiezen die je wilt laten weergeven op de sorteerlijst)
Vervolgens worden deze geplaatst in de database.
(user_name,user_full_name,user_back_name) gescheiden met een ,
Als ik dan de sorteerlijst bekijk maakt hij een query
PHP:
1
2
3
4
5
6
$get['sortlist_field_input'] = user_name,user_full_name,user_back_name (gekozen in form)
$get['sortlist_db'] = users (gekozen in form)

(SELECT ".$get['sortlist_field_input']." FROM ".$get['sortlist_db'].")
oftuwel
(SELECT user_name,user_full_name,user_back_name FROM users)



Nu wil ik ipv dat ik alles moet uit typen $data[' '] om alle velden zetten zodat ik gelijk de resultaten krijg dus alles in totaal had ik deze code:

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<table width="100%" border="0" cellspacing="12" cellpadding="0">
        <? $header = '<td>'.str_replace(',','</td><td>',$get['sortlist_field_title']).'</td>'; ?>    
        <? $row = 'echo '.str_replace(',','echo ',$get['sortlist_field_data']).''; ?>
    <? $rows = '<td>'.str_replace(';',';</td><td>',eval($row)).'</td>'; ?>

    <? $sql = "SELECT ".$get['sortlist_field_input']." FROM ".$get['sortlist_db']."";
       $res = mysql_query($sql); ?>
        <tr bgcolor="#003399">
          <?= $header; ?>
// hier komt de header dan: Gebruikersnaam, Naam, Achternaam
        </tr>
        <? while($data = mysql_fetch_array($res)) { ?>
        <tr>
       <?= $rows; ?>
// Hier de rijen echo $data['user_name'],etc etc
       </tr>
    <? } ?>    
   </table>

[ Voor 14% gewijzigd door Verwijderd op 04-03-2008 19:25 ]


Acties:
  • 0 Henk 'm!

  • user109731
  • Registratie: Maart 2004
  • Niet online
Waarom niet zoiets:
PHP:
1
2
3
4
5
6
7
8
9
10
11
$fields = array('user_name', 'user_fullname');
$table = 'mytable';

$sql = sprintf('SELECT %s FROM %s', implode(',', $fields), $table);
$res = mysql_query($sql);

while($data = mysql_fetch_assoc($res)) {
  foreach($fields as $field) {
    echo $data[$field];
  }
}

Denk wel goed na over je beveiliging. Bijvoorbeeld door een lijst met toegestane tabellen en toegestane velden te maken. Je kunt ook altijd 'SELECT *' doen, en checken of $data een key $field heeft. Dan hoef je alleen nog de tabelnaam te controleren :)

[ Voor 12% gewijzigd door user109731 op 04-03-2008 19:30 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
JanDM schreef op dinsdag 04 maart 2008 @ 19:24:
Waarom niet zoiets:
PHP:
1
2
3
4
5
6
7
8
9
10
11
$fields = array('user_name', 'user_fullname');
$table = 'mytable';

$sql = sprintf('SELECT %s FROM %s', implode(',', $fields), $table);
$res = mysql_query($sql);

while($data = mysql_fetch_assoc($res)) {
  foreach($fields as $field) {
    echo $data[$field];
  }
}

Denk wel goed na over je beveiliging. Bijvoorbeeld door een lijst met toegestane tabellen en toegestane velden te maken. Je kunt ook altijd 'SELECT *' doen, en checken of $data een key $field heeft. Dan hoef je alleen nog de tabelnaam te controleren :)
Bedankt, ziet er goed uit! ga het proberen ik denk soms veelste moeilijk na 8)7

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Bedankt het is gelukt! _/-\o_

serialize en unserialize, daar was ik naar op zoek.

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
$fields = unserialize($get['sortlist_field_data']);
$titles = unserialize($get['sortlist_field_title']);

$table = $get['sortlist_db']; 
// SQL
$sql = sprintf('SELECT %s FROM %s', implode(',', $fields), $table); 
$res = mysql_query($sql); 

// HEADER
  echo '<tr>'; 
  foreach($titles as $title) { 
    echo '<td>'.$title.'</td>'; 
  } 
    echo '</tr>';
    
// ROWS
while($data = mysql_fetch_assoc($res)) {
echo '<tr>'; 
  foreach($fields as $field) { 
    echo '<td>'.$data[$field].'</td>'; 
  } 
echo '</tr>';
}


:)

Acties:
  • 0 Henk 'm!

  • H004
  • Registratie: Maart 2006
  • Laatst online: 28-05 19:55
Klein puntje: voor een header (regel 12 in bovenstaande code) gebruik je natuurlijk <th> ipv <td>! (Is ook meteen makkelijker te stylen met css!)

Acties:
  • 0 Henk 'm!

  • robbert
  • Registratie: April 2002
  • Laatst online: 11:40
Verwijderd schreef op dinsdag 04 maart 2008 @ 21:04:
Bedankt het is gelukt! _/-\o_

serialize en unserialize, daar was ik naar op zoek.

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
$fields = unserialize($get['sortlist_field_data']);
$titles = unserialize($get['sortlist_field_title']);

$table = $get['sortlist_db']; 
// SQL
$sql = sprintf('SELECT %s FROM %s', implode(',', $fields), $table); 
$res = mysql_query($sql); 

// HEADER
  echo '<tr>'; 
  foreach($titles as $title) { 
    echo '<td>'.$title.'</td>'; 
  } 
    echo '</tr>';
    
// ROWS
while($data = mysql_fetch_assoc($res)) {
echo '<tr>'; 
  foreach($fields as $field) { 
    echo '<td>'.$data[$field].'</td>'; 
  } 
echo '</tr>';
}


:)
Waar komt die data in $get vandaan? Ik zou die op zijn mist wel controleren, wie weet heb je iets als $fields = array("username", "password") en $table = "users" Of een of andere gare string die niet goed ge-escpaped is....
Pagina: 1