php - MySQL 选择不返回资源

标签 php javascript mysql

我的 PHP MySQL Select 有一个小问题。该函数位于 PHP 类中。这是我得到的错误:

Warning: mysql_fetch_array() expects parameter 1 to be resource, integer given in C:\xampp\htdocs\include\database.php on line 59 Warning: extract() expects parameter 1 to be array, null given in C:\xampp\htdocs\include\database.php on line 59

该函数只是简单地更新数据库以显示他们访问网站时使用的浏览器和操作系统。该函数是从另一个文件调用的,该文件由 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);
    }
}

我希望一切都有意义,并且有人会提供帮助。

最佳答案

我现在明白了——当您打算使用 $q1 时,您使用了 $ql(小写 L)。让这成为反对使用非常短的变量名称或非常相似的名称的教训。

// $ql was initialized to 0
$ql = 0; $totalVisits = 0;

// $q1 holds the result resource
extract(mysql_fetch_array($q1));

不建议在 mysql_fetch_array() 的输出上调用 extract() 除非您还指定第二个参数 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'];

关于php - MySQL 选择不返回资源,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10629129/

相关文章:

php - [PHP][MySQL] 如何同时向2个表插入数据?

php选择字符串中的数字

PHP MySQL - 在不存储 key 的情况下动态加密解密数据

javascript - 配置 - 是否有基于 Web 的 github 连接工具?

javascript - Three.js 随机点列表

javascript - jQuery 推子点交互功能

php - 用于选择元值的 wordpress 自定义查询

php - 填充字符串中的空格

javascript - 客户端和服务器端编程有什么区别?

MySQL:多遍字符串连接