Parse error

19 отговора 345 прегледа
#1

Parse error

Здравейте

Как да се оправя с тоя бъг в PHP когато давам $x->file да не ми връща
parse error, unexpected T_OBJECT_OPERATOR, expecting ',' or ';'

Отговор
в отговор на cтyдeнт #2

Re: Parse error

ми $x дали ти е обект?

Отговор
в отговор на Bълk #3

Re: Parse error

Трябваше да поясня.
Значи правя връзка към excel file и всичко върви добре докато не се опитам да изведа записите от файла в html - а с един цикъл и:
echo $selectedsheet->Cells($i,$x)->value;
Иначе останалото си минава без грешка например като правя избор на определен sheet $selectedsheet = $openworkfile->Worksheets($sheet);

Отговор
в отговор на cтyдeнт #4

Re: Parse error

Добро пояснение

И къде е обекта?

Отговор
в отговор на cтyдeнт #5

Re: Parse error

А странното е че при мен локално върви наред аз съм с PHP Version 5.0.3

Отговор
в отговор на N.W. #6

Re: Parse error

$excel = new COM ("Excel.sheet") or die ("Did not connect");

Отговор
в отговор на cтyдeнт #7

Re: Parse error

А странното е че parse error назоваваш бъг в PHP

Отговор
в отговор на cтyдeнт #8

Re: Parse error

Here is a COM function that creates an excel spreadsheet with any number of worksheets, containing data from a matching number of SQL queries. Be ware of the upper limit of excel worksheets. This function properly shuts down Excel on the server.
/***************************/
function WriteExcel($strPath,$astrSheetName,$astrSQL){
/* This function takes a file save path, and array of sheet names and a corresponding array */
/* of SQL queries for each sheet and created a multi-worksheet excel spreadsheet*/
$C_NAME=__CLASS__."::".__FUNCTION__;
$dbs=new clsDB;
$exapp = new COM("Excel.Application") or Die ("Did not connect");
$intSheetCount=count($astrSheetName);
$wkb=$exapp->Workbooks->Add();
$exapp->Application->Visible = 1;
for ($int=0;$int<$intSheetCount;$int++){
$sheet=$wkb->Worksheets($int+1);
$sheet->activate;
$sheet->Name=$astrSheetName[$int];
$intRow=1;
$qrySQL=$dbs->GetQry($astrSQL[$int],$C_NAME,__LINE__);
$rstSQL=$qrySQL->fetchRow(DB_FETCHMODE_ASSOC);
$astrKeyNames=array_keys($rstSQL);
$intCols=count($astrKeyNames);
$qrySQL=$dbs->GetQry($astrSQL[$int],$C_NAME,__LINE__);
while($rstSQL=$qrySQL->fetchRow(DB_FETCHMODE_ASSOC)){
$strOut="";//initialize the output string
for ($int2=0;$int2<$intCols;$int2++){//we start at 1 because don't want to output the table's index
if($intRow==1){
$strOut=$astrKeyNames[$int2];
}else{
$strOut=$rstSQL[$astrKeyNames[$int2]];
}
$sheet->activate;
$cell=$sheet->Cells($intRow,($int2+1));//->activate;
$cell->Activate;
$cell->value = $strOut;
}//end of colcount for loop
$intRow++;
}//end while loop
}//end sheetcount for loop
if (file_exists($strPath)) {unlink($strPath);}
$wkb->SaveAs($strPath);
$wkb->Close(false);
unset($sheet);
$exapp->Workbooks->Close(false);
unset($wkb);
$exapp->Quit;
unset($exapp);
unset($dbs);
}//function WriteExcel

Отговор
в отговор на N.W. #9

Re: Parse error

Изходих от тук [линк]

Отговор
в отговор на cтyдeнт #10

Re: Parse error

А прочете ли за какво става въпрос?

А погледна ли датата?

А прочете ли коментарите отдолу?

Тогава - как "изходи", че е бъг? Parse error най-често сепоявява при грешки които се допускат при съставяне на кода - изядени символи, логическа недосмислица и т.н. и т.н. не бързай да търсиш бъгове в PHP, а си провери обстойно кода.

Отговор
в отговор на N.W. #11

Re: Parse error

Добре де хубаво ти си прав щом искаш ок.
Как обаче при мен работи а като го кача на хоста не върви. Което явно е доказателство че кода ми е наред.

Отговор
в отговор на cтyдeнт #12

Re: Parse error

А на хоста каква е версията?

И ще ни дадеш ли малко примерен код да видим за какво иде реч?

Everything louder than everything else...
Отговор
в отговор на cтyдeнт #13

Re: Parse error

echo $selectedsheet->Cells($i,$x)->value();

Отговор
в отговор на Dakota #14

Re: Parse error

На първия хост версията на PHP е 4.3.11 а на другия е 4.3.2 при мен е 5.0.3.

Ето и малко код:

$excel = new COM ("Excel.sheet") or die ("Did not connect");
$openworkfile = $excel->Application->Workbooks->Open ($excel_file)
or Die ("Did not open");
$selectedsheet = $openworkfile->Worksheets($sheet);
$allrows = $selectedsheet->UsedRange->Rows->Count;
$allcolumns = $selectedsheet->UsedRange->Columns->Count;
for ($i = 1; $i <= $allrows; $i++) {
for ($x = 1; $x <= $allcolumns; $x++) {
$returdata = $selectedsheet->Cells($i,$x)->value;
echo $returndata."\n";
}
}

Отговор
в отговор на _cro #15

Re: Parse error

М/у другото за да ти работи перфектно връзката м/у Ексел и PHP трябва да бръкнеш в настройките на ODBC-то и да им дадеш максимум разрешен кеш за Excel driver-a. Иначе ще получаваш странни грешки от типа "с двайсе клетки може, но с 40 не може"
За да минимизираш употребата на кеша може също така да си помагаш с Activate():

$xl = COM("Excel.Application");
$wbs =$xl->Workbooks();
$wb = $wbs->Open("C:\.....");
$wb->Activate();
$ws = $wb->Worksheets(1);
$ws->Activate();
......


Освен това избягвай когато е възможно редове като този:

$selectedsheet->Cells($i,$x)->value();

Вместо това ги разбий на две:

$cell = $selectedsheet->Cells($i,$x);
$cellvalue = $cell->Value()


Тъпо и досадно е, но така ще ти дава най-малко бъгове. Ексела през COM е жива трагедия.

Отговор
в отговор на cтyдeнт #16

Re: Parse error

Смени $returdata = $selectedsheet->Cells($i,$x)->value; с
$dummy = $selectedsheet->Cells($i,$x);
$returdata = $dummy->value;

Отговор
в отговор на cтyдeнт #17

Re: Parse error

$allcolumns = $selectedsheet->UsedRange->Columns->Count;

Сигурен ли си, че това върви?
echo $allcolumns; какво ти връща?

Отговор
в отговор на _cro #18

Re: Parse error

Да това работи върви наред. Връща ми всички колони в които има въведено нещо

Отговор
в отговор на kaпитaнчo #19

Re: Parse error

Много ти благодаря това за момента работи перфектно.
Можеш ли да ми обясниш причината при мен да работи както си беше по старо му а иначе не. Само с твоя пример работи на останалите хостове

Отговор
в отговор на kaпитaнчo #20

Re: Parse error

Е най - смешното е че сега пък на мойта машина не работи с промените които ме посъветва иначе на хостингите си е наред :)

Отговор