2013-09-07 2 views
-2

Это уже прослушивало меня на прошлый день. Вот код:PHP Неопределенное смещение внутри класса

public function getUserCredits() 
{ 
    $dbl = new databaseManager(); 
    $dbl->connect_simp(); 
    $ret = $dbl->queryDB("SELECT * FROM users WHERE `USER_ID` = ".$this->userId); 
    $this->userCredits = $ret['USER_CREDITS']; 

    return $this->userCredits; 
} 

Теперь, когда я пытаюсь запустить этот код, я получаю сообщение об ошибке undefined offset. Ничего слишком странного в этом, когда я впервые увидел это, но теперь это происходит все больше и больше, и я не могу понять, почему.

Я могу использовать var_dump(); и var_export();, и он отображает содержимое возвращаемого массива абсолютно точно.

EDIT:

array(1) { 
    [0]=> 
    array(50) { 
    ["USER_ID"]=> 
    string(10) "0000000001" 
    [0]=> 
    string(10) "0000000001" 
    ["USER_USERNAME"]=> 
    string(8) "SampleUsername" 
    [1]=> 
    string(8) "SampleUsername" 
    ["USER_PASSWORD"]=> 
    string(32) "5f4dcc3b5aa765d61d8327deb882cf99" 
    [2]=> 
    string(32) "5f4dcc3b5aa765d61d8327deb882cf99" 
    ["USER_EMAIL"]=> 
    string(0) "" 
    [3]=> 
    string(0) "" 
    ["USER_LEGION"]=> 
    string(1) "1" 
    [4]=> 
    string(1) "1" 
    ["USER_ENERGY"]=> 
    string(4) "2812" 
    [5]=> 
    string(4) "2812" 
    ["USER_MAX_ENERGY"]=> 
    string(4) "2812" 
    [6]=> 
    string(4) "2812" 
    ["USER_SHIELD"]=> 
    string(2) "20" 
    [7]=> 
    string(2) "20" 
    ["USER_MAX_SHIELD"]=> 
    string(2) "20" 
    [8]=> 
    string(2) "20" 
    ["USER_HULL"]=> 
    string(2) "60" 
    [9]=> 
    string(2) "60" 
    ["USER_MAX_HULL"]=> 
    string(2) "60" 
    [10]=> 
    string(2) "60" 
    ["USER_CREDITS"]=> 
    string(19) "9223372036854775807" 
+0

** Вы полностью раскрываете атаки SQL-инъекций. ** Пожалуйста, ознакомьтесь с использованием параметризованных запросов, предпочтительно с модулем PDO, для защиты вашего веб-приложения. У http://bobby-tables.com/php есть примеры, чтобы вы начали, и [этот вопрос] (http://stackoverflow.com/questions/60174/how-can-i-prevent-sql-injection-in- php) имеет много примеров. –

+0

Можете ли вы добавить вывод 'var_dump()' к вопросу? – raina77ow

+0

добавьте также результат var_dump. – hallaji

ответ

0

попробовать

$ret[0]['USER_CREDITS'] 

вместо

$ret['USER_CREDITS'] 
+0

Это сработало. Я вроде бы глупо, что не видел этого раньше. Спасибо огромное! Отметьте как ответ, когда это позволит мне. В то же время, не могли бы вы объяснить, почему это работает? – jhmckimm

+0

О, я вижу это сейчас. Это массив внутри массива. – jhmckimm

+0

не беспокойтесь, это случается иногда. Это связано с тем, что результатом sql-запроса является массив массивов. Первый массив - это все столбцы в таблице, соответствующие условию, а второй массив - поля столбца. –

0

Вы должны принести ряд первый (я предполагаю, что вы расширяете mysqli).

$result = $dbl->queryDB("SELECT * FROM users WHERE `USER_ID` = ".$this->userId); 
$row = $dbl->fetch_assoc($result) ; 

$this->userCredits = $row['USER_CREDITS']; 
+0

Откуда вы знаете? возможно, 'queryDB' возвращает полученные данные ... – hallaji

0

AS ваш var_dump($ret), Попробуйте назначить пользовательский кредит в противном случае, если он не установлен, то присвоить 0 значение.

if(isset($ret[0]['USER_CREDITS'])){ 
    $this->userCredits = $ret[0]['USER_CREDITS']; 
} 
else{ 
    $this->userCredits = 0; 
} 
0

Сначала вы должны посмотреть результат. По мере того, как вы получаете детали в массиве вашей записи в базу данных, она находится в формате массива с цифровыми клавишами. Используйте то, что сказал @AbuOmar.

Смежные вопросы