PHP script causes a segmentation error, then the browser asks to download the .php file without anything in it?

I noticed an unusual problem with some of my php programs. Sometimes when you visit a page, for example profile.edit.php, the browser displays a dialog box asking you to load the profile.edit.php page. When I download it, there is nothing in the file. Profile.edit.php is supposed to be a web form that edits user information.

I noticed this on some of my other php pages. I look through the apache error logs and see a segmentation error message:

[Mon Mar 08 15:40:10 2010] [notice] child pid 480 exit signal Segmentation fault (11)

In addition, the problem may or may not appear depending on which server I am also deploying the application on.

Additional Information This does not happen all the time. Sometimes this happens. For example, profile.edit.php will load properly. But as soon as I click the save button (form action = "profile.edit.php? Save = true"), then the page will ask me to load profile.edit.php. Maybe sometimes my php scripts consume too many resources?

Code example

After saving the action, my profile.edit.php includes the data_access_object.php file. I traced the code in data_access_object.php in this line here

 if($params[$this->primaryKey])
 {
                        $q = "UPDATE $this->tableName SET ".implode(', ', $fields)." WHERE ".$this->primaryKey." = ?$this->primaryKey";
                        $this->bind($this->primaryKey, $params[$this->primaryKey], $this->tblFields[$this->primaryKey]['mysqlitype']);
}
 else
{
$q = "INSERT $this->tableName SET ".implode(', ', $fields);
}
// Code executes perfectly up to this point
// echo 'print this'; exit; // if i uncomment this line, profile.edit.php will actually show 'print this'.  If I leave it commented, the browser will ask me to download profile.edit.php
if(!$this->execute($q)){ $this->errorSave = -3; return false;}
// When I jumped into the function execute(), every line executed as expected, right up to the return statement.  

And if that helps, here's the execute ($ sql) function in data_access_object.php

function execute($sql)
{

        // find all list types and explode them
        // eg. turn ?listId into ?listId0,?listId1,?listId2 
        $arrListParam = array_bubble_up('arrayName', $this->arrBind);

        foreach($arrListParam as $listName)
           if($listName)
           {
                $explodeParam = array();
                $arrList = $this->arrBind[$listName]['value'];
                foreach($arrList as $key=>$val)
                {
                        $newParamName = $listName.$key;
                        $this->bind($newParamName,$val,$this->arrBind[$listName]['type']);
                        $explodeParam[] = '?'.$newParamName;
                }
                $sql = str_replace("?$listName", implode(',',$explodeParam), $sql);
           }

        // replace all ?varName with ? for syntax compliance
        $sqlParsed = preg_replace('/\?[\w\d_\.]+/', '?', $sql);
        $this->stmt->prepare($sqlParsed);

        // grab all the parameters from the sql to create bind conditions
        preg_match_all('/\?[\w\d_\.]+/', $sql, $matches);
        $matches = $matches[0];

        // store bind conditions
        $types = ''; $params = array();
        foreach($matches as $paramName)
        {
                $types .= $this->arrBind[str_replace('?', '', $paramName)]['type'];
                $params[] = $this->arrBind[str_replace('?', '', $paramName)]['value'];
        }

        $input = array('types'=>$types) + $params;



        // bind it
        if(!empty($types))
        call_user_func_array(array($this->stmt, 'bind_param'), $input);

        $stat = $this->stmt->execute();
        if($GLOBALS['DEBUG_SQL'])
                echo '<p style="font-weight:bold;">SQL error after execution:</p> ' . $this->stmt->error.'<p>&nbsp;</p>';

        $this->arrBind = array();
        return $stat;
}
+5
source share
6 answers

, . , PHP. Apache, () :

<FilesMatch \.php$>
    SetHandler application/x-httpd-php
</FilesMatch>

: , . . .

+1

, . , . , / .

+1

, PHP .

0

, AddType application/x-httpd-php .php .phtml httpd.conf

, , "" HTML-. :

<form action="myphpfile.php" method="get">
  <input type="hidden" name="save" value="true" />
  First name: <input type="text" name="firstname" /><br />
  Last name: <input type="text" name="lastname" /><br />
  <input type="submit" value="Submit" />
</form>

, . , . "get" , "post", . "" .

0

SQL-? :

// echo 'print this'; exit; 

, :

echo "Query: $q";
exit;

...

, , :

INSERT some_table SET field1, field2, field3

:

INSERT INTO some_table SET field1='value 1', field2='value 2', field3='value 3'
0

, - Apache , - php , script.

Apache, apache, , . , , , , , , , .

" " , . - Apache , , , , .

, script , apache. , , script - .

If the script timeout is always lower than the apache timeout, you will get a more informative error "Fatal error: Maximum execution time ...".

0
source

All Articles