Autor Zpráva
ato3
Profil
Zdravím,
potřeboval bych pomoci. Ke generování xls používám tuto třídu http://www.bettina-attack.de/jonny/view.php/projects/php_writeexcel/
a najednou mi v jednom skriptu, kde tuto třídu používám začaly vyskakovat tyto chyby:

Warning: mb_strlen() expects parameter 1 to be string, object given in /home/www/example.cz/htdocs/includes/class.writeexcel_worksheet.inc.php on line 1203

Warning: mb_strlen() expects parameter 1 to be string, object given in /home/www/example.cz/htdocs/includes/class.writeexcel_worksheet.inc.php on line 1207

Warning: mb_strlen() expects parameter 1 to be string, object given in /home/www/example.cz/htdocs/includes/class.writeexcel_worksheet.inc.php on line 1203

Warning: mb_strlen() expects parameter 1 to be string, object given in /home/www/example.cz/htdocs/includes/class.writeexcel_worksheet.inc.php on line 1207

část kódu skriptu, který vyhazuje chyby:
	
$worksheet->write($xr, $xs, trim($rec4['cislo_sm'])." ",$smlouva_ukoncena);
$xs++;
$worksheet->write($xr, $xs, trim($rec4['dat_is']). " ",$ukoncena);
$xs++;
$worksheet->write($xr, $xs, trim($rec4['time']). " ",$ukoncena);
$xs++;
$worksheet->write($xr, $xs, trim($rec4['date']) . " ",$ukoncena);
$xs++;
$worksheet->write($xr, $xs, trim($rec6[0]). " ",$ukoncena);
$xs++;
$worksheet->write($xr, $xs, trim($rec7[0]) . " ",$ukoncena);
$xs++;
$worksheet->write($xr, $xs, trim($rec6['pocet_uzivatelu'])." ",$ukoncena);


Čím je prodle vás chyba pravděpodobně způsobena?
Řádek, na kterém se warning vypisuje je v metodě write_string(), která je volána metodou write(). Právě proto jsem vložil jako příklad část kde je metoda write volána. Je na ní něco špatně? Jako 3. parametr předávám string, nepředávám object.
Poraďte, prosím.
nightfish
Profil
v souboru class.writeexcel_worksheet.inc.php na řádcích 1203 a 1207 se funkci mb_strlen() jako první parametr předává objekt, ač se mu správně musí předávat řetězec
to jste mohl vyčíst z těch warningů
podrobnější určení příčiny není možné bez nahlédnutí do zdrojového kódu uvedeného souboru
ato3
Profil
nightfish:
To jsem vyčetl, jak píšu na konci příspěvku.
Řádek, na kterém se warning vypisuje je v metodě write_string(), která je volána metodou write(). Právě proto jsem vložil jako příklad část kde je metoda write volána. Je na ní něco špatně? Jako 3. parametr předávám string, nepředávám object.
Co konkrétně bych sem měl ještě dát ze zdrojového kodu, než volání té metody, kde pravděpodobně chyba nastala?
Majkl578
Profil
ato3:
Jako 3. parametr předávám string, nepředávám object.
Žádný třetí parametr funkce mb_strlen nemá. První parametr je string, druhý kódování.
ato3
Profil
Majkl578:
Myslel jsem 3. parametr metody write()
write($xr, $xs, trim($rec6['pocet_uzivatelu'])." ",$ukoncena);
nightfish
Profil
ato3:
Co konkrétně bych sem měl ještě dát ze zdrojového kodu, než volání té metody, kde pravděpodobně chyba nastala?
metodu, v níž se volá mb_strlen() (případně další relevantní metody, aby se dala pochopit struktura volání (až po vaše $worksheet->write)
ato3
Profil
	
$res = pg_query($con,"SET CLIENT_ENCODING TO 'win-1250'");
$res = pg_query($con,"SET DATESTYLE TO German");

session_start();
$session_id = session_id();
set_time_limit(300);
$cesta_soubory="../tmp/";

###########################################################################

require_once "../in/class.writeexcel_workbook.inc.php";
require_once "../in/class.writeexcel_worksheet.inc.php";

$soubor = $cesta_soubory . $session_id . "_vypis.xls";

$workbook = &new writeexcel_workbook($soubor);
$worksheet = &$workbook->addworksheet();
$worksheet->set_landscape();
$worksheet->set_margins('0');

# --------------------- DEFINICE FORMATU PISMA --------------------------------------------------------
$nadpis =& $workbook->addformat();
$nadpis->set_bold();
$nadpis->set_align('left');
$nadpis->set_size(10);

$text_vlevo =& $workbook->addformat();
$text_vlevo->set_align('left');
$text_vlevo->set_align('top');
$text_vlevo->set_size(8);
$text_vlevo->set_border_color('black');
$text_vlevo->set_top(1);
$text_vlevo->set_bottom(1);
$text_vlevo->set_right(1);
$text_vlevo->set_left(1);

$text_vpravo =& $workbook->addformat();
$text_vpravo->set_align('right');
$text_vpravo->set_align('top');
$text_vpravo->set_size(8);
$text_vpravo->set_border_color('black');
$text_vpravo->set_top(1);
$text_vpravo->set_bottom(1);
$text_vpravo->set_right(1);
$text_vpravo->set_left(1);

$text_bold_vlevo =& $workbook->addformat();
$text_bold_vlevo->set_bold();
$text_bold_vlevo->set_align('left');
$text_bold_vlevo->set_align('vcenter');
$text_bold_vlevo->set_size(8);
$text_bold_vlevo->set_text_wrap();
$text_bold_vlevo->set_border_color('black');
$text_bold_vlevo->set_top(1);
$text_bold_vlevo->set_bottom(1);
$text_bold_vlevo->set_right(1);
$text_bold_vlevo->set_left(1);

# --------------------- DEFINICE SIRKY SLOUPCU
$worksheet->set_column(0, 0, 12);
$worksheet->set_column(1, 1, 30);
$worksheet->set_column(2, 2, 10);
$worksheet->set_column(3, 40 , 30);

# --------------------- DEFINICE VYSKY RADKU
# $worksheet->set_row(3, 10);
# definice vysky radku se provadi pro kazdy radek pri vypisovani

$xr = 0;
$xs = 0;

$worksheet->write($xr, $xs, "Seznam", $nadpis);

$xr++;
$xr++;
$xs=0;

$SQL3x = "SELECT";
$res3x = pg_query($SQL3x);
$res3x_num = pg_num_rows($res3x);

$klice=array();
for($a=0;$a<$res3x_num;$a++)
	{
	@$r3x = pg_fetch_array($res3x,$a);
	
	$worksheet->write($xr, $xs, $r3x["name"]." ",$text_bold_vlevo);
	$klice[] = $r3x['param'];
	$xs++;
	}

$worksheet->write($xr, $xs, "Číslo",$text_bold_vlevo);
$xs++;
$worksheet->write($xr, $xs, "Datum",$text_bold_vlevo);
$xs++;
$worksheet->write($xr, $xs, "Datum",$text_bold_vlevo);
$xs++;
$worksheet->write($xr, $xs, "Datum",$text_bold_vlevo);
$xs++;
$worksheet->write($xr, $xs, "Mesto",$text_bold_vlevo);
$xs++;
$worksheet->write($xr, $xs, "Datum",$text_bold_vlevo);
$xs++;
$worksheet->write($xr, $xs, "Počet",$text_bold_vlevo);

$SQL3 = "SELECT";
@$res3 = pg_query($con,$SQL3);
@$res3_num = pg_num_rows($res3);

//#####################################################x
for($i=0;$i<$res3_num;$i++) {
		$xs = 0;
		
		@$r3 = pg_fetch_array($res3,$i);
		
		$SQL4 = "SELECT";
		@$res4 = pg_query($con, $SQL4);
		@$r4 = pg_fetch_array($res4);
			
		$SQL5 = "SELECT";
		@$res5 = pg_query($con, $SQL5);
		@$res5_num = pg_num_rows($res5);	
		
		$data = array();
		while($r5 = pg_fetch_array($res5)) {
			$data[$r5['parametr_jmeno']] = $r5['hodnota'];
		}

		$SQL6 = "SELECT";
		@$res6 = pg_query($SQL6);
		@$r6 = pg_fetch_array($res6);
		
		$SQL7 = "SELECT";
		@$res7 = pg_query($SQL7);
		@$r7 = pg_fetch_array($res7);
		
		$ukoncena=false;
		if ($r4['datum_ukonceni'] = "") {
			$ukoncena = true;
		}
		
		if (!$ukoncena){
			$SQL4x = "SELECT ";
			@$res4x = pg_query($con, $SQL4x);
			@$r4x = pg_fetch_array($res4x);
			if ($r4x['stats'] == 1) {
				$ukoncena = true;
			}
		}
		
		if ($ukoncena) 
				{
				$xr++;
				
				foreach($klice as $key) {
					if(isset($data[$key])){
						$worksheet->write($xr, $xs, trim($data[$key]) . " ",$text_vlevo);
					} else {
						$worksheet->write($xr, $xs, " ",$text_vlevo);
					}
					$xs++;
				}

				$worksheet->write($xr, $xs, trim($r4['cislo'])." ",$text_vlevo);
				$xs++;
				$worksheet->write($xr, $xs, trim($r4['datum'])." ",$text_vlevo);
				$xs++;
				$worksheet->write($xr, $xs, trim($r4['datum'])." ",$text_vlevo);
				$xs++;
				$worksheet->write($xr, $xs, trim($r4['datum'])." ",$text_vlevo);
				$xs++;
				$worksheet->write($xr, $xs, trim($r6[0])." ",$text_vlevo);
				$xs++;
				$worksheet->write($xr, $xs, trim($r7[0])." ",$text_vlevo);
				$xs++;
				$worksheet->write($xr, $xs, trim($r6['pocet'])." ",$text_vpravo);
				}		
		}	

$xr++;
$xr++;
$xs=0;
$worksheet->write($xr, $xs, "Pozn.: ***.",$text_vlevo);

##############################################################################
$workbook->close();	
nightfish
Profil
ato3:
kód pěkný, teď ještě to, co jsem psal v [#6] - tedy "vnitřek" metody (pravděpodobně) write_string
ato3
Profil
nightfish:
function write_string() {

    $_=func_get_args();

    # Check for a cell reference in A1 notation and substitute row and column
    if (preg_match('/^\D/', $_[0])) {
        $_ = $this->_substitute_cellref($_);
    }

    # Check the number of args
    if (sizeof($_) < 3) {
        return -1;
    }

    $record  = 0x0204;                        # Record identifier
    $length  = 0x0008 + strlen($_[2]);        # Bytes to follow

    $row     = $_[0];                         # Zero indexed row
    $col     = $_[1];                         # Zero indexed column
    $strlen  = strlen($_[2]);
    $str     = $_[2];
    $xf      = $this->_XF($row, $col, $_[3]); # The cell format

    $str_error = 0;

    # Check that row and col are valid and store max and min values
    if ($row >= $this->_xls_rowmax) { return -2; }
    if ($col >= $this->_xls_colmax) { return -2; }
    if ($row <  $this->_dim_rowmin) { $this->_dim_rowmin = $row; }
    if ($row >  $this->_dim_rowmax) { $this->_dim_rowmax = $row; }
    if ($col <  $this->_dim_colmin) { $this->_dim_colmin = $col; }
    if ($col >  $this->_dim_colmax) { $this->_dim_colmax = $col; }

    if ($strlen > $this->_xls_strmax) { # LABEL must be < 255 chars
        $str       = substr($str, 0, $this->_xls_strmax);
        $length    = 0x0008 + $this->_xls_strmax;
        $strlen    = $this->_xls_strmax;
        $str_error = -3;
    }

    $header    = pack("vv",   $record, $length);
    $data      = pack("vvvv", $row, $col, $xf, $strlen);

    $this->_append($header . $data . $str);
	
    return $str_error;
}
nightfish
Profil
tak ještě jeden pokus... pošlete metodu, která je v souboru class.writeexcel_worksheet.inc.php okolo řádku 1203
ato3
Profil
nightfish:
to je ona[#9] řádek 1203 odpovídá řádku 13, tedy
$length  = 0x0008 + strlen($_[2]); 

Ještě metoda write, která je volána přímo v mém skriptu[#7]
function write() {

    $_=func_get_args();

    # Check for a cell reference in A1 notation and substitute row and column
    if (preg_match('/^\D/', $_[0])) {
        $_ = $this->_substitute_cellref($_);
    }

    $token = $_[2];

    # Match an array ref.
    if (is_array($token)) {
        return call_user_func_array(array(&$this, 'write_row'), $_);
    }

    # Match number
    if (preg_match('/^([+-]?)(?=\d|\.\d)\d*(\.\d*)?([Ee]([+-]?\d+))?$/', $token)) {
        return call_user_func_array(array(&$this, 'write_number'), $_);
    }
    # Match http, https or ftp URL
    elseif (preg_match('|^[fh]tt?ps?://|', $token)) {
        return call_user_func_array(array(&$this, 'write_url'), $_);
    }
    # Match mailto:
    elseif (preg_match('/^mailto:/', $token)) {
        return call_user_func_array(array(&$this, 'write_url'), $_);
    }
    # Match internal or external sheet link
    elseif (preg_match('[^(?:in|ex)ternal:]', $token)) {
        return call_user_func_array(array(&$this, 'write_url'), $_);
    }
    # Match formula
    elseif (preg_match('/^=/', $token)) {
        return call_user_func_array(array(&$this, 'write_formula'), $_);
    }
    # Match blank
    elseif ($token == '') {
        array_splice($_, 2, 1); # remove the empty string from the parameter list
        return call_user_func_array(array(&$this, 'write_blank'), $_);
    }
    # Default: match string
    else {
        return call_user_func_array(array(&$this, 'write_string'), $_);
    }
}
nightfish
Profil
ato3:
pak nerozumím tomu, proč varování zmiňuje mb_strlen, zatímco v [#9] je jen strlen...

možná by pomohlo do toho write_string dát
$_[2] = (string)$_[2];

ale je to prasárna
spíš by to chtělo zjistit, jaký objekt a odkud se tam dostal
díval jsem se, že se tam používají funkce s proměnlivým počtem argumentů, a ještě se ty argumenty předávají, takže to asi bude docela chuťovka
Joker
Profil
ato3:
to je ona[#9]
A kde se tedy vezme to varování vyprodukované z mb_strlen, když v tom kódu se nikde mb_strlen nevolá?

edit: moc pomalý...
Možná bych nejdřív zjistil, co tam vůbec leze: var_dump ($_[2]);
ato3
Profil
Joker:
Díky! takže už vím, že tam opravdu přijde object.
Nastane to tehdy, když je 3. parametr nejspíš prázdný, protože se tam nacpe 4. parametr, který je object.
Myslíte, že stačí, když ošetřuju tenhle případ tak, že ke 3. parametru přidávám na konci ." " Jako např. tady?
$worksheet->write($xr, $xs, trim($r7[0])." ",$text_vlevo);


Prošel jsem všechny volání metody write() ve skriptu a nikde jsem za 3. parametr nezapomněl dát ." ", nevíte jak by bylo jinak možné, aby se 4. parametr nacpal místo 3.?

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: