Ik ben bezig met FCKeditor en op mn localhost (PHP Version 5.1.2) werkt het prima.
Maar upload ik m naar een server met PHP Version 4.4.2 dan krijg ik de foutmelding:
Warning: Invalid argument supplied for foreach() in .... /fckeditor.php on line 110

De code is erg lang van fckeditor.php maar ik zal m posten, hopelijk kan iemand me helpen
want ik snap niet waarom het niet werkt.
De argumenten lijken wel degelijk te kloppen (en werkt dus ook in PHP 5.1.2)

<? class RCMS
{
var $InstanceName ;
var $BasePath ;
var $Width ;
var $Height ;
var $ToolbarSet ;
var $Value ;
var $Config ;

// PHP 5 Constructor
function __construct( $instanceName )
{
$this->InstanceName = $instanceName ;
$this->BasePath = '/FCKeditor/' ;
$this->Width = '100%' ;
$this->Height = '500' ;
$this->ToolbarSet = 'Default' ;
$this->Value = '' ;

$this->Config = array() ;
}

// PHP 4 Contructor
function FCKeditor( $instanceName )
{
$this->__construct( $instanceName ) ;
}

function Create()
{
echo $this->CreateHtml() ;
}

function CreateHtml()
{
$HtmlValue = htmlspecialchars( $this->Value ) ;

$Html = '<div>' ;

if ( $this->IsCompatible() )
{
if ( isset( $_GET['fcksource'] ) && $_GET['fcksource'] == "true" )
$File = 'fckeditor.original.html' ;
else
$File = 'fckeditor.html' ;

$Link = "{$this->BasePath}editor/{$File}?InstanceName={$this->InstanceName}" ;

if ( $this->ToolbarSet != '' )
$Link .= "&amp;Toolbar={$this->ToolbarSet}" ;

// Render the linked hidden field.
$Html .= "<input type=\"hidden\" id=\"{$this->InstanceName}\" name=\"{$this->InstanceName}\" value=\"{$HtmlValue}\" style=\"display:none\" />" ;

// Render the configurations hidden field.
$Html .= "<input type=\"hidden\" id=\"{$this->InstanceName}___Config\" value=\"" . $this->GetConfigFieldString() . "\" style=\"display:none\" />" ;

// Render the editor IFRAME.
$Html .= "<iframe id=\"{$this->InstanceName}___Frame\" src=\"{$Link}\" width=\"{$this->Width}\" height=\"{$this->Height}\" frameborder=\"no\" scrolling=\"no\"></iframe>" ;
}
else
{
if ( strpos( $this->Width, '%' ) === false )
$WidthCSS = $this->Width . 'px' ;
else
$WidthCSS = $this->Width ;

if ( strpos( $this->Height, '%' ) === false )
$HeightCSS = $this->Height . 'px' ;
else
$HeightCSS = $this->Height ;

$Html .= "<textarea name=\"{$this->InstanceName}\" rows=\"4\" cols=\"40\" style=\"width: {$WidthCSS}; height: {$HeightCSS}\">{$HtmlValue}</textarea>" ;
}

$Html .= '</div>' ;

return $Html ;
}

function IsCompatible()
{
global $HTTP_USER_AGENT ;

if ( isset( $HTTP_USER_AGENT ) )
$sAgent = $HTTP_USER_AGENT ;
else
$sAgent = $_SERVER['HTTP_USER_AGENT'] ;

if ( strpos($sAgent, 'MSIE') !== false && strpos($sAgent, 'mac') === false && strpos($sAgent, 'Opera') === false )
{
$iVersion = (float)substr($sAgent, strpos($sAgent, 'MSIE') + 5, 3) ;
return ($iVersion >= 5.5) ;
}
else if ( strpos($sAgent, 'Gecko/') !== false )
{
$iVersion = (int)substr($sAgent, strpos($sAgent, 'Gecko/') + 6, 8) ;
return ($iVersion >= 20030210) ;
}
else
return false ;
}

function GetConfigFieldString()
{
$sParams = '';
$bFirst = true;
//-- HIER GAAT HET MIS -----------------------------------------------------------------
foreach($this->Config as $sKey => $sValue)
{
if ( $bFirst == false )
$sParams .= '&amp;' ;
else
$bFirst = false ;

if ( $sValue === true )
$sParams .= $this->EncodeConfig( $sKey ) . '=true' ;
else if ( $sValue === false )
$sParams .= $this->EncodeConfig( $sKey ) . '=false' ;
else
$sParams .= $this->EncodeConfig( $sKey ) . '=' . $this->EncodeConfig( $sValue ) ;
}

return $sParams ;
}

function EncodeConfig( $valueToEncode )
{
$chars = array(
'&' => '%26',
'=' => '%3D',
'"' => '%22' ) ;

return strtr( $valueToEncode, $chars ) ;
}
}

?>
En $this->Config is zeker weten een array?

edit: laat maar, in de contructor wordt hij als array geinitialiseerd zie ik.
Ja prcs dat vond ik ook het vreemde eraan.
Ik ben al vanaf 12:00 bezig hiermee maar ik kom er echt niet meer uit :s
ik weet niet waar de fout zit.
maar heb wel een vraagje.
ik weet wat != betekent en == etc..
maar wat betekent === ?
Upload het volgende voorbeeld eens om te testen of foreach werkt:
<?php
$array = array ();
$array['een'] = 1;
$array['twee'] = 2;
$array['drie'] = 3;

foreach ($array as $key => $value) {
echo '<p>Key: '.$key.', Value: '.$value.'</p>';
}
?>
@Jan
Key: een, Value: 1

Key: twee, Value: 2

Key: drie, Value: 3

Werkt dus prima.
ps. dit moest gewoon in een aparte file geupload worden toch, en niet in het scritpt?

@Aoi
=== Betekend: Identiek aan. Dus ook een check of ze van hetzelfde type zijn.
@Rob: ja, als test in een aparte file. Ik had ook wel verwacht dat hij zou werken want foreach bestaat al sinds PHP4

Ik denk dat je probleem ontstaat omdat hij voor PHP4 die andere (tweede) constructorfunctie pakt waarin je array niet geinitialiseerd wordt.
Oke thnx! dat is duidelijk.
Heb je misschien een idee hoe ik dit zou kunnen oplossen?
Ik zie dat die PHP4 constructor gewoon de constructorfunctie voor PHP5 aanroept eigenlijk. Vaag. Doe eens de volgende test:
<?php
// PHP 5 Constructor
function __construct( $instanceName )
{
$this->InstanceName = $instanceName ;
$this->BasePath = '/FCKeditor/' ;
$this->Width = '100%' ;
$this->Height = '500' ;
$this->ToolbarSet = 'Default' ;
$this->Value = '' ;

$this->Config = array() ;
}

// PHP 4 Contructor
function FCKeditor( $instanceName )
{
$this->InstanceName = $instanceName ;
$this->BasePath = '/FCKeditor/' ;
$this->Width = '100%' ;
$this->Height = '500' ;
$this->ToolbarSet = 'Default' ;
$this->Value = '' ;

$this->Config = array() ;
}
?>
dus hard de code van de PHP5 constructor in de PHP4 constructor plakken.
Ik moet even een half uurtje weg, maar kom zo nog even kijken of het gelukt is :-)
ik heb geprobeerd wat je vroeg. maar nog steeds het zelfde effect.
ik snap het echt niet meer... :(

Reageren