我有一个用PHP编写的类,它应该找到将放在主文件中的文本框旁边的标签(当我创建它时)。基本上,该类搜索我的数据库以查找所选形状的标签(将从主页面传递)。当我使用虚拟值运行函数时,就好像我的$ dbConnection值没有设置值。我得到一个错误,说$ dbConnection是未定义的,然后更多的错误说函数期望某个参数类型,但给定的类型为null。当我看,他们都指向$ 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;
}
}
只是为了踢和咯咯笑,这是我的测试文件(传递虚拟值)。我知道round是DB中的有效值,所以我知道这不是问题。
$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";
}
答案 0 :(得分:1)
你班上有一个错字/错误,在这里为你纠正:
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());
修改强>:
die()
停止执行PHP脚本。在这种情况下,它对调试很有用,因为它可以防止脚本的其余部分运行并转储一堆错误(就像它当前正在为你做的那样)。 mysql_connect("localhost", "root", "") or die(mysql_error());
告诉脚本如果连接不成功,停止php脚本并输出mysql错误,这样你就可以获得解决问题的信息。
其中一个挑战是,当您告诉我们行号时,但上面引用的代码中的哪一行?通过行号,PHP可以准确地告诉您故障的位置。你能告诉我们哪一行是37和40?
答案 1 :(得分:0)
在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";