Is it just み?

PHP

Developers Shame Day 2010

by on Nov.03, 2010, under PHP, Programmierung

Danach habe ich gesucht – ein Vorwand der mir wieder Lust macht was in mein Blog zu schreiben.

Auf zum…

Auch bei mir finden sich ziemliche Klöpse aus meiner PHP-Anfangszeit und daher möchte ich doch gerne meine Unfähigkeit in der Vergangenheit  protokollieren. und das obwohl PHP nicht meine erste Programmiersprache war – ich glaube ich werde in meine Pascal und Delphi Quelltexte aus Schulzeiten lieber erst gar nicht mehr reingucken… Man möge mir einfach glauben, dass ich dazugelernt habe. Wirklich!!!1!

Das folgende Beispiel ist schon ein wenig gekürzt, sollte aber die vielen Probleme und Dämlichkeiten deutlich zeigen. Ich glaube das war so von 2002 oder so.

In der “secure.php” wurde bloß das übertragene Passwort überprüft. Und ob dem Benutzer der vorher in der globalen Variable $permstring gesetzte String zugeordnet ist – ‘SA’ stand, glaube ich, für “Server Admin”. Man achte auch auf das hardgecodete (jedoch hier durch XXX ersetzte) $_POST[‘password’]. m(

Der Rest des Codes schreibt Befehle in eine Datei, die dann alle 5 Minuten mit root-Rechten (!) von eimen Cronjob als Bash-Script abgearbeitet wird. Übelst.


<?php


session_start
();

$permstring 'SA';
include(
'secure.php');
$myself basename($_SERVER['PHP_SELF']);

function 
writeCommand($command)
{
  
$cronfile '/srv/www/htdocs/XXX/html/XXXcron';

  
$fp fopen($cronfile,'a');
  
fputs($fp,$command."\n");
  
fclose($fp);
}

$jobs = array(
  
//array( Gruppe, Bezeichner, Befehl, Beschreibung)
  
array('Sonstiges''timesync''/root/timesync > /dev/null''Zeitsynchronisation'),
  array(
'Apache''apache2_restart''/etc/init.d/apache2 restart > /dev/null''Apache2 Restart'),
  array(
'Lokales Backup''local_backup_mysql''/root/local_mysqlbackup > /dev/null''Lokales MySQL-Backup (FullDump)'),
  array(
'Lokales Backup''local_backup_webs''/root/local_websbackup > /dev/null''Lokales Webspace-Backup (Alle Webs)'),
  array(
'Backup''backup_webs'    '/root/websbackup > /dev/null''Webspace-Backup (Alle Webs)'),
  array(
'Backup''backup_srvbackup''/root/srvbackup > /dev/null''/srv-Backup (Alle Webs)')
);

sort($jobs);

if(
$_POST['password'] == 'XXX' && !empty($_POST['which']))
{
  echo 
"
    <center>
    <div style='width: 350px; border: 2px #AA0000 dashed; text-align: left; vertical-align: middle; padding: 20px;'>
    <br/>
    <center style='color: #FF0000; font-weight: bold;'>
        Folgende Änderungen wurden geschrieben:
    </center>
    <br/>"
;

  
$which $_POST['which'];
  echo 
"
    <ol>"
;

  for(
$x=0;$x<count($which);$x++)
  {
    for(
$y=0;$y<count($jobs);$y++)
    {
      if(
$which[$x] == $jobs[$y][1])
      {
        echo 
"<li>";
        
writeCommand($jobs[$y][2]);
        echo 
$jobs[$y][3];
        echo 
"</li>";
      }
    }
  }

  echo 
"
    </ol>"
;
  echo 
"
    <br/>
    <div style='color: #FF0000; font-weight: normal; font-size: 10px;'>
    Die Abarbeitung der Aufgaben wird innerhalb der nächsten 5 Minuten beginnen.<br/>
    <i>Eventuelle Fehlermeldungen werden an root geschickt.</i><br/>
    </div>
    <br/>
    </div>
    </center>"
;
}
else
{
  echo 
"<form action='$myself' method='POST'>";
  for(
$x=0$x<count($jobs); $x++)
  {
    if(
$gruppe !=  $jobs[$x][0])
      echo 
'<b>'ucfirst($jobs[$x][0]) .':</b><br/>';
    if(@
in_array($jobs[$x][1], $_POST['which'])) $checked 'checked=checked ';
      echo 
"<input type='checkbox' name='which[]' value='"$jobs[$x][1] ."' $checked/>"$jobs[$x][3] ."<br/>";
    
$checked '';
    
$gruppe $jobs[$x][0];
  }
echo 
"
  <br/>
  Autorisation: <input type='password' name='password' /><br/>
  <input type='submit' value='Starten...'/>
  </form>"
;
}

Es tut schon ein wenig weh, diesen alten Code, den ich aus meinem ältesten Festplatten-Backup geholt habe zu veröffentlichen, irgendwie habe ich jetzt das verlangen duschen zu gehen…

Ab Morgen kann ich ja wieder so tun als würde ich keine Fehler machen. 😉

3 Comments :, more...

WordPress: Highlight PHP Code

by on Nov.22, 2009, under PHP, Programmierung, Technik

Ich werde mal versuchen einige meiner Einträge auf Englisch zu verfassen – um in der Übung zu bleiben.

I like to write about programming, and since I am using WordPress and writing plugins for it, PHP is the language of choice when it comes to blog-related development.

I wanted to put my PHP-Code into my entries and I wanted it to look nice, which means mono-spaced font and syntax highlighting. The first one was fairly easy to archieve by just changing the CSS. Whenever I put code into my blog, I write it between <pre> and </pre>, so I just had to change the CSS for the pre-element:

 pre {
    height: auto; 
    overflow: auto;
    color: #EEE;
    padding: 5px;
    margin: 10px;
    scroll: auto;
    font-family: Courier New, monospace;
    font-weight: bold;
    white-space: pre;
    font-size: 9pt;
    line-height: 10pt;
}

The highlighting however must be done on the server side by PHP, so I had to write another (in fact two) filter-function:


<?php


function highlightCode($content) {
    if (
false === strpos($content'<pre>')) {
        return 
$content;
    }

    
$content preg_replace_callback(
        
'|\<pre\>(.*?)\</pre\>|is',
        
'highlightCodeCallback',
        
$content
    
);

    return 
$content;
}

function 
highlightCodeCallback($matches) {
    if (
false === strpos($matches[0], '<?php')) {
        return 
$matches[0];
    }
    
    
$code $matches[0];
    
$code preg_replace(
        
'|\<code\>\s*\</code\>|is'
        
'/*§§BR§§*/'$code
    
);
    
$code strip_tags($code);
    
// Wordpress adds the space when saving
    
$code str_replace('<?php''<?php'$code); 
    
$code highlight_string($codetrue);
    
$code str_replace('/*§§BR§§*/'"\n\n"$code);
    
$code htmlspecialchars_decode($code);
    
$code str_replace('<?php''<?php'$code);

    return 
'<pre>'$code .'</pre>';
}
Comments Off on WordPress: Highlight PHP Code :, , more...

WordPress: Filter certain categories on main page

by on Nov.20, 2009, under PHP, Programmierung

Ich werde mal versuchen einige meiner Einträge auf Englisch zu verfassen – um in der Übung zu bleiben.

I am using the Twitter Tools plugin to automatically create Tweets for my blog entries and vice versa to have some kind of tweet archive on my blog. That works flawlessly.

The only problem is: I tweet too much. I only want to show five entries on my front page, which basically means, that my last real blog entry is gone after one or two days, because of the twitter entries. The solution: Entries from the Tweets category should not be visible on the front page.

I had to extend my my-blog-exclusively-plugin with a function that filters the posts that appear on the front page, for this I added a filter to the hook “the_posts” which is called quite early in the loop before anything has been done to the posts. The posts that would be shown on the front page are given to the callback-function as first parameter in the form of an array. Here is the code:


<?php


/**/
// Filter post from the category Tweets on front page
add_filter(
    
'the_posts',
    
'filterTweets'
); /**/

function filterTweets($posts) {
    
// Filter only on the front page!
    
if (!is_front_page()) {
        return 
$posts;
    }

    
$tweetCategoryName 'Tweets';
    
$numVisiblePosts 5;

    
$postsToShow = array();
    
$filteredPosts = array();

    
$num 0;
    foreach (
$posts as $post) {
        
$cats in_category($tweetCategoryName, (int) $post->ID);
        if (!
$cats) {
            
$postsToShow[] = $post;
            
$num++;
        } else {
            
$filteredPosts[] = $post;
        }

        if (
$num >= $numVisiblePosts) {
            break;
        }
    }

    if (
$num $numVisiblePosts) {
        
// Too many twitter posts... what the hell... show some of them
        
$numTwitterPosts $numVisiblePosts $num;
        
$postsToShow array_merge(
            
$postsToShow
            
array_slice($filteredPosts0$numTwitterPosts)
        );
    }

    return 
$postsToShow;
}

Another thing I had to do was increase the number of posts shown on the front page, since my plugin now handles restricting the number of posts and I have to ensure that my function gets at least some posts that are not tweets. (But even if there are not enough, it fills up the front page with twitter posts.)

Comments Off on WordPress: Filter certain categories on main page :, , , , more...

GRAND Flash Album Gallery Extras

by on Sep.13, 2009, under Photos, PHP, Programmierung

Heute mal auf Englisch, weil das Originalplugin auch in English zur Verfügung steht.

Update 2009-09-13: New version. Can now work around WP-Cache

GRAND Flash Album Gallery is a simple to use and professional looking way to present pictures on your website, it even has a nice looking full-screen-option.

There were two features that I really missed:

  • Ability to link to a specific gallery and picture
  • Removing the [Gallery not found]-tags from excerpts

For those two I wrote my own little plugin called “flash-album-gallery-extras“.
It is more of a quickhack than a real plugin because I had to change the central xml.php file that comes with the Flash Album Gallery Skins (which is used to output an ordered xml-list of the pictures grouped by galleries) and because I use two Session-variables to “communicate” with the xml.php. Changing the flash that requests the xml to using additional GET-Parameters would be a cleaner approach, but that would require the authors help.

Maybe he likes my approach and integrates my code (or my idea) into his original solution.

Comments Off on GRAND Flash Album Gallery Extras :, , , , , more...