Переменная не устанавливает свое значение - PullRequest
0 голосов
/ 14 марта 2012

У меня есть класс, написанный на php, который должен найти метки, которые будут помещены рядом с текстовыми полями в главном файле (когда я его создаю). В основном класс просматривает мою БД, чтобы найти метки для выбранной фигуры (которая будет передана с главной страницы). Когда я запускаю функции с использованием фиктивных значений, создается впечатление, что мое значение $ dbConnection не устанавливает значение. Я получаю сообщение об ошибке, в котором говорится, что $ dbConnection не определено, а затем появляется больше ошибок, в которых говорится, что функции ожидают определенного типа параметра, но данный тип является нулевым. Когда я смотрю, все они указывают на переменную $ dbConnection. Мой класс выглядит так:

 class lblFinder
        {
            //declarations
                private $dbConnection;
                private $dbName="matecalculator";

                private $cmd="";
                private $size=0;
            //end of declarations
            public function __construct()
            {
                $this->dbConnection=mysql_connect("localhost", "root", "");
            }

            public function setSize($shape)
            {
                if($this->dbConnection===false)
                {
                    echo "<p>Something went wrong.</p><p> Error Code:".mysql_errno().": ".mysql_error()."</p>";
                }
                else
                {
                    if(mysql_select_db($this->dbName,$this->dbConnection))
                    {
                        $cmd="SELECT COUNT(varID) FROM tblvariables WHERE shapeID IN(SELECT shapeID FROM tblshapes WHERE shapeName='$shape')";
                        $qryResults=mysql_query($cmd,$dbConnection);

                        //get results
                        while (($Row = mysql_fetch_row($qryResults)) !== FALSE)
                        {
                            $size=$Row[0];
                        }

                        mysql_free_result($qryResults);
                    }
                    else
                    {
                        echo "<p>Something went wrong.</p><p> Error Code:".mysql_errno().": ".mysql_error()."</p>";
                    }
                }
            }

            public function getSize()
            {
                return $this->size;
            }

            public function setLabels($shape)
            {
                //declarations
                    $l=array();
                //end of declarations

                $this->cmd="SELECT varDesc FROM tblVariables WHERE shapeID IN(SELECT shapeID FROM tblShapes WHERE shapeName= '".$shape."')";
                $qryResults=mysql_query($cmd,$dbConnection);

                $i=0;
                if(($Row = mysql_fetch_row($qryResults)) !== FALSE)
                {
                    $l[i]=$Row[0];
                    $i++;
                }
                mysql_free_result($qryResults);
                return $l;
            }
        }

Просто для пинки и хихиканья, вот мой тестовый файл (который передает фиктивные значения). Я знаю, что округление является допустимым значением из БД, поэтому я знаю, что это не проблема.

 $arr=array();
        $lf=new lblFinder;
        $lf->setSize("Round");
        echo "Size=".$lf->getSize();
        $arr=$lf->setLabels("Round");
        $i=0;
        foreach($arr AS $label)
        {
            echo "Label $i is $label";
        }

Ответы [ 2 ]

1 голос
/ 14 марта 2012

В вашем классе есть опечатка / ошибка, исправленная для вас:

public function setLabels($shape)
        {
            //declarations
                $l=array();
            //end of declarations

            $this->cmd="SELECT varDesc FROM tblVariables WHERE shapeID IN(SELECT shapeID FROM tblShapes WHERE shapeName= '".$shape."')";
            $qryResults=mysql_query($cmd,$dbConnection);

            $i=0;
            if(($Row = mysql_fetch_row($qryResults)) !== FALSE)
            {
                $l[$i]=$Row[0]; // The $ symbol was missing from the i
                $i++;
            }
            mysql_free_result($qryResults);
            return $l;
        }

Кроме того, для простоты вы могли бы написать следующее:

public function setLabels($shape)
        {
            //declarations
                $l=array();
            //end of declarations

            $this->cmd="SELECT varDesc FROM tblVariables WHERE shapeID IN(SELECT shapeID FROM tblShapes WHERE shapeName= '".$shape."')";
            $qryResults=mysql_query($cmd,$dbConnection);

            if(($Row = mysql_fetch_row($qryResults)) !== FALSE)
            {
                $l[]=$Row[0]; // Do not need to increment index of array, php does automatically
            }
            mysql_free_result($qryResults);
            return $l;
        }

Если соединение возвращает значение NULL, вы можете устранить эту проблему, выдав ошибку, возникающую во время соединения, следующим образом:

$this->dbConnection=mysql_connect("localhost", "root", "") or die("Error connecting to DB: " . mysql_error());

EDIT :
die() приостанавливает выполнениесценария PHP.В подобных случаях это полезно для отладки, так как предотвращает запуск остальной части скрипта и выводит кучу ошибок (как это происходит сейчас).mysql_connect("localhost", "root", "") or die(mysql_error()); сообщает сценарию, что , если соединение не установлено , остановить сценарий php и вывести ошибку mysql, поэтому у вас есть информация для устранения неполадок.

Одной из проблем являетсячто пока вы говорите нам номер строки, но какая строка в вашем коде приведена выше?С помощью номера строки PHP сообщает вам, где именно произошла ошибка.Можете ли вы сказать нам, какие строки 37 и 40?

0 голосов
/ 14 марта 2012

В функциях setSize и setLabels вы ссылаетесь на $cmd и $dbConnection, когда должны использоваться $this->cmd и $this->dbConnection.

В обеих функциях локальная переменная$dbConnection не определено.

Кроме того, как указал @cale_b, в вашем цикле была опечатка с i, и вы можете использовать or die(), чтобы остановить выполнение остальной части скрипта.В зависимости от того, как используется этот класс, может быть лучше вернуть ошибку, а не останавливать все выполнение PHP.Если вы хотите сделать это, вы можете сделать что-то вроде:

$this->dbConnection = mysql_connect("localhost", "root", "");
if (!$this->dbConnection)
    return "error";
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...