我的PHP MySQL Select遇到了一个小问题。该函数位于PHP类中。这是我得到的错误:
警告:mysql_fetch_array()期望参数1是资源, 在第59行的C:\ xampp \ htdocs \ include \ database.php中给出的整数 警告:extract()期望参数1为数组,给定为null 第59行的C:\ xampp \ htdocs \ include \ database.php
该功能只是简单地更新数据库,以显示他们访问该网站的浏览器和操作系统。该函数从另一个文件调用,该文件由AJAX调用调用,该调用使用POST发送有关从Javascript文件收集的操作系统和浏览器的数据。只有在数据库中已存在IP地址条目时才会失败。如果数据库中没有IP地址条目,则成功创建一个。
这是我的代码:
function addStat($browser, $os){
$IE = 0; $Firefox = 0; $Safari = 0; $Opera = 0; $Chrome = 0; $otherb = 0;
$Windows = 0; $Linux = 0; $Mac = 0; $Android = 0; $iOS = 0; $otheros = 0;
$ql = 0; $totalVisits = 0;
$ip = ip2long($_SERVER['REMOTE_ADDR']);
$q1 = mysql_query("SELECT * FROM " . DB_STATS . " WHERE ip='$ip'", $this->connection);
if (mysql_num_rows($q1)==0){
$browser = mysql_real_escape_string($browser);
$os = mysql_real_escape_string($os);
switch($browser){
case "Internet Explorer":
$IE += 1;
break;
case "Firefox":
$Firefox += 1;
break;
case "Safari":
$Safari += 1;
break;
case "Opera":
$Opera += 1;
break;
case "Chrome":
$Chrome += 1;
break;
default:
$otherb += 1;
break;
}
switch($os){
case "Windows":
$Windows += 1;
break;
case "Mac OS X":
$Mac += 1;
break;
case "Linux":
$Linux += 1;
break;
case "Android":
$Android += 1;
break;
case "iOS":
$iOS += 1;
break;
default:
$otheros += 1;
break;
}
$q = $this->query("INSERT INTO " . DB_STATS . " VALUES (null, '$ip', '$Chrome', '$IE', '$Firefox', '$Opera', '$Safari', '$otherb', '$Windows', '$Mac', '$Linux', '$Android' , '$iOS' , '$otheros', 1)");
if ($q == true){
return(1);
}
else{
return(0);
}
}
else if (mysql_num_rows($q1)==1){
extract(mysql_fetch_array($ql));
switch($browser){
case "Internet Explorer":
$IE += 1;
break;
case "Firefox":
$Firefox += 1;
break;
case "Safari":
$Safari += 1;
break;
case "Opera":
$Opera += 1;
break;
case "Chrome":
$Chrome += 1;
break;
default:
$otherb += 1;
break;
}
switch($os){
case "Windows":
$Windows += 1;
break;
case "Mac OS X":
$Mac += 1;
break;
case "Linux":
$Linux += 1;
break;
case "Android":
$Android += 1;
break;
case "iOS":
$iOS += 1;
break;
default:
$otheros += 1;
break;
}
$totalVisits += 1;
$q = $this->query("UPDATE " . DB_STATS . " set Chrome='$Chrome', IE='$IE', Firefox='$Firefox', Opera='$Opera', Safari='$Safari', otherb='$otherb', Windows='$Windows', Mac='$Mac', Linux='$Linux', Android='$Android' , iOS='$iOS' , otheros='$otheros', totalVisits='$totalVisits'");
if ($q == true){
return(1);
}
else{
return(0);
}
}
else{
return(-1);
}
}
我希望一切都有意义,有人会帮助。
答案 0 :(得分:3)
我现在看到了 - 当您打算使用$ql
时,您使用了$q1
(小写L)。让这成为使用非常短的变量名或非常相似的名称的教训。
// $ql was initialized to 0
$ql = 0; $totalVisits = 0;
// $q1 holds the result resource
extract(mysql_fetch_array($q1));
除非您还指定第二个参数extract()
作为提取类型,否则不建议在mysql_fetch_array()
的输出上调用MYSQL_ASSOC
。默认情况下,它为每列返回两个数字和关联索引。
extract(mysql_fetch_array($q1, MYSQL_ASSOC));
// Or better
extract(mysql_fetch_assoc($q1));
一般情况下,我可能建议不要在大多数情况下使用extract()
,因为它会导致许多变量被转储到全局命名空间中,特别是当你完成SELECT *
时没有具体说明列被选中。最好通过他们的阵列访问它们:
$row = mysql_fetch_assoc($q1);
echo $row['browser'];