2013-10-07 2 views
1

mysql을 mysqli로 변경하려고 시도했습니다. 그리고 내가 이것을 할 때 나는 오류가납니다. 나는 모든 것을 시도했지만 이것에 대한 해결책을 찾지 못했습니다.경고 : mysqli_num_rows()는 매개 변수 1이 mysqli_result 인 것으로 예상합니다.

내가 가진 오류 : (당신이 무엇을보고는 모든 오류)

경고 : mysqli_query() 매개 변수 1가 null
C에 주어진, mysqli있을 것으로 기대 : \ XAMPP \ htdocs를 \ 라인 database.php \ 포함 \ 따라 219

경고 : mysqli_num_rows() 기대 파라미터를 NULL C 1에 주어진 mysqli_result 될 : \ XAMPP \ htdocs를 \ 따르 \ 라인 database.php 포함 \ 220

경고 : mysqli_query()는 매개 변수 1이 mysqli, null이 될 것으로 예상한다. 255 행의 include \ database.php

경고 : mysqli_num_rows()는 매개 변수 1이 C : \ xampp \ htdocs \ follow \ include \ database에 지정된 mysqli_result로 null 일 것을 기대합니다. 라인 232

경고에 .php :) (mysqli_query를 파라미터 1 널 C에 주어진 mysqli 것으로 기대 : \ XAMPP \ htdocs를 \ 따르 \ 라인 database.php 포함 \ 102

이상의 오류 ...

이 내 PHP 코드

입니다
<?php 
/** 
* Please subscribe to our feeds at http://blog.geotitles.com for more such tutorials 
*/ 
include("constants.php"); 
class MySQLDB 
    { 
    var $connection;   //The MySQL database connection 
var $num_active_users; //Number of active users viewing site 
var $num_active_guests; //Number of active guests viewing site 
var $num_members;  //Number of signed-up users 
/* Note: call getNumMembers() to access $num_members! */ 

    /* Class constructor */ 
    function MySQLDB(){ 
    /* Make connection to database */ 

$con = mysqli_connect(DB_SERVER, DB_USER, DB_PASS,DB_NAME); 

    // Check connection 
if (mysqli_connect_errno()) 
    { 
    echo "Failed to connect to MySQL: " . mysqli_connect_error(); 
    } 



    /** 
    * Only query database to find out number of members 
    * when getNumMembers() is called for the first time, 
    * until then, default value set. 
    */ 
    $this->num_members = -1; 

    if(TRACK_VISITORS){ 
    /* Calculate number of users at site */ 
    $this->calcNumActiveUsers(); 

    /* Calculate number of guests at site */ 
    $this->calcNumActiveGuests(); 
    } 
    } 


    function confirmUserPass($username, $password){ 
    GLOBAL $con; 
    /* Add slashes if necessary (for query) */ 
    if(!get_magic_quotes_gpc()) { 
     $username = addslashes($username); 
    } 

    /* Verify that user is in database */ 
    $q = "SELECT password FROM ".TBL_USERS." WHERE username = '$username'"; 
    $result = mysqli_query($con,$q); 
    if(!$result || (mysqli_num_rows($result) < 1)){ 
    return 1; //Indicates username failure 
    } 

    /* Retrieve password from result, strip slashes */ 
    $dbarray = mysqli_fetch_array($result); 
    $dbarray['password'] = stripslashes($dbarray['password']); 
    $password = stripslashes($password); 

    /* Validate that password is correct */ 
    if($password == $dbarray['password']){ 
    return 0; //Success! Username and password confirmed 
    } 
    else{ 
    return 2; //Indicates password failure 
    } 
    } 


    function confirmUserID($username, $userid){ 
    GLOBAL $con; 
    /* Add slashes if necessary (for query) */ 
    if(!get_magic_quotes_gpc()) { 
     $username = addslashes($username); 
    } 

    /* Verify that user is in database */ 
    $q = "SELECT userid FROM ".TBL_USERS." WHERE username = '$username'"; 
    $result = mysqli_query($con,$q); 
    if(!$result || (mysqli_num_rows($result) < 1)){ 
    return 1; //Indicates username failure 
    } 

    /* Retrieve userid from result, strip slashes */ 
    $dbarray = mysqli_fetch_array($result); 
    $dbarray['userid'] = stripslashes($dbarray['userid']); 
    $userid = stripslashes($userid); 

    /* Validate that userid is correct */ 
    if($userid == $dbarray['userid']){ 
    return 0; //Success! Username and userid confirmed 
    } 
    else{ 
    return 2; //Indicates userid invalid 
    } 
    } 


    function usernameTaken($username){ 
    GLOBAL $con; 
    if(!get_magic_quotes_gpc()){ 
    $username = addslashes($username); 
    } 
    $q = "SELECT username FROM ".TBL_USERS." WHERE username = '$username'"; 
    $result = mysqli_query($con,$q); 
    return (mysqli_numrows($result) > 0); 
    } 


function usernameBanned($username){ 
GLOBAL $con; 
    if(!get_magic_quotes_gpc()){ 
    $username = addslashes($username); 
    } 
    $q = "SELECT username FROM ".TBL_BANNED_USERS." WHERE username = '$username'"; 
    $result = mysqli_query($con,$q); 
    return (mysqli_numrows($result) > 0); 
    } 

function addNewUser($username, $password, $email){ 
GLOBAL $con; 
    $time = time(); 
    /* If admin sign up, give admin user level */ 
    if(strcasecmp($username, ADMIN_NAME) == 0){ 
    $ulevel = ADMIN_LEVEL; 
    }else{ 
    $ulevel = USER_LEVEL; 
    } 
    $q = "INSERT INTO ".TBL_USERS." VALUES ('$username', '$password', '0', $ulevel,  '$email', $time)"; 
    return mysqli_query($con,$q); 
    } 


function updateUserField($username, $field, $value){ 
    $q = "UPDATE ".TBL_USERS." SET ".$field." = '$value' WHERE username = '$username'"; 
    return mysqli_query($con,$q); 
} 


    function getUserInfo($username){ 
GLOBAL $con; 
    $q = "SELECT * FROM ".TBL_USERS." WHERE username = '$username'"; 
    $result = mysqli_query($con,$q); 
    /* Error occurred, return given name by default */ 
    if(!$result || (mysqli_num_rows($result) < 1)){ 
    return NULL; 
    } 
    /* Return result array */ 
    $dbarray = mysqli_fetch_array($result); 
    return $dbarray; 
    } 


function getNumMembers(){ 
GLOBAL $con; 
    if($this->num_members < 0){ 
    $q = "SELECT * FROM ".TBL_USERS; 
    $result = mysqli_query($con,$q); 
    $this->num_members = mysqli_num_rows($result); 
    } 
    return $this->num_members; 
    } 

    /** 
    * calcNumActiveUsers - Finds out how many active users 
    * are viewing site and sets class variable accordingly. 
    */ 
    function calcNumActiveUsers(){ 
GLOBAL $con; 
    /* Calculate number of users at site */ 
    $result = mysqli_query($con,"SELECT * FROM ".TBL_ACTIVE_USERS); 
    $this->num_active_users = mysqli_num_rows($result); 
    } 


    function calcNumActiveGuests(){ 
    GLOBAL $con; 
    /* Calculate number of guests at site */ 
    $q = "SELECT * FROM ".TBL_ACTIVE_GUESTS; 
    $result = mysqli_query($con,$q); 
    $this->num_active_guests = mysqli_num_rows($result); 
    } 


    function addActiveUser($username, $time){ 
GLOBAL $con; 
    $q = "UPDATE ".TBL_USERS." SET timestamp = '$time' WHERE username = '$username'"; 
    mysqli_query($con,$q); 

    if(!TRACK_VISITORS) return; 
    $q = "REPLACE INTO ".TBL_ACTIVE_USERS." VALUES ('$username', '$time')"; 
    mysqli_query($con,$q); 
    $this->calcNumActiveUsers(); 
    } 

function addActiveGuest($ip, $time){ 
GLOBAL $con; 
    if(!TRACK_VISITORS) return; 
    $q = "REPLACE INTO ".TBL_ACTIVE_GUESTS." VALUES ('$ip', '$time')"; 
    mysqli_query($con,$q); 
    $this->calcNumActiveGuests(); 
    } 

function removeActiveUser($username){ 
GLOBAL $con; 
    if(!TRACK_VISITORS) return; 
    $q = "DELETE FROM ".TBL_ACTIVE_USERS." WHERE username = '$username'"; 
    mysqli_query($con,$q); 
    $this->calcNumActiveUsers(); 
    } 

/* removeActiveGuest */ 
function removeActiveGuest($ip){ 
GLOBAL $con; 
    if(!TRACK_VISITORS) return; 
    $q = "DELETE FROM ".TBL_ACTIVE_GUESTS." WHERE ip = '$ip'"; 
    mysqli_query($con,$q); 
    $this->calcNumActiveGuests(); 
} 

/* removeInactiveUsers */ 
function removeInactiveUsers(){ 
GLOBAL $con; 
    if(!TRACK_VISITORS) return; 
    $timeout = time()-USER_TIMEOUT*60; 
    $q = "DELETE FROM ".TBL_ACTIVE_USERS." WHERE timestamp < $timeout"; 
    mysqli_query($con,$q); 
    $this->calcNumActiveUsers(); 
} 

/* removeInactiveGuests */ 
function removeInactiveGuests(){ 
GLOBAL $con; 
    if(!TRACK_VISITORS) return; 
    $timeout = time()-GUEST_TIMEOUT*60; 
    $q = "DELETE FROM ".TBL_ACTIVE_GUESTS." WHERE timestamp < $timeout"; 
    mysqli_query($con,$q); 
    $this->calcNumActiveGuests(); 
} 


function query($query){ 
GLOBAL $con; 
    return mysqli_query($con,$query); 
} 
}; 


    $database = new MySQLDB; 

    ?> 
+0

이러한 오류는 어떤 행에서 시작됩니까? –

+4

이것은 코드가 완전히 끔찍합니다. 당신은 useslashes/stripslashes를 사용하고 있습니다. ** USELESS **는 SQL injection을 방지합니다. mysqli는 이미 완벽하게 좋은 이스케이프 메커니즘을 가지고 있으며, 필요성을 제거하는 prepared statement/placeholder 기능을 가지고 있습니다. 어쨌든 수동 탈출을 할 수 있습니다. –

답변

2

오류는 상당히 모호하지만 구체적입니다. 연결 개체 인 mysql_result이 필요하지만 대신 null을 수신 중입니다.

그 이유는 각 함수 내에서 연결을 사용하려고 시도하는 방법은 다음과 같습니다

global $con; 
mysqli_query($con, $q); 

당신이 그것을에서 사용하고있는 기능에 전역 변수에 가져올 것 global 키워드 만 $con은이 클래스의 전역 변수가 아니기 때문에 클래스 내에 global을 사용할 필요가 없습니다. 대신 당신이 찾고있는 것은 $this 키워드입니다.

클래스 생성자 MySQLDB()에서 $con 변수를 정의합니다.

global $con; 
mysqli_query($con,$q); 

당신은 사용할 수 있습니다 : 다음

$this->connection = mysqli_connect(DB_SERVER, DB_USER, DB_PASS,DB_NAME); 

대신 같은 것을 사용하는 각 기능에 : 이미 $connection라는 이름의 전역 변수를 정의한로 대신이 $this->connection를 사용하도록 변경해야합니다 :

mysqli_query($this->connection, $q); 
1

생성자에 $con을 정의합니다 (변수를 준비 했으므로 $this->connection에 저장해야 함). 함수에서 정의 되었기 때문에 전역 변수가 아니므로 global $con;을 사용하여 가져올 수 없습니다. 연결 처리기를 사용하는 모든 곳에서 $this->connection을 올바르게 사용하면 올바르게 작동합니다.

관련 문제