2015-05-02 7 views
-1

Выполняю следующий код, который создает временную таблицу в качестве UUID_SHORT для company_id.PHP MYSQL SELECT Возвращает NULL

Этот company_id затем будет использоваться для вставки записей в несколько таблиц с UUID в качестве первичного ключа. Моя проблема в том, что когда я пытаюсь получить company_id, который является $ company_id, мой код равен нулю. Однако, если я json_encode ($ tempResult), значение company_id есть. Что я делаю не так?

Любая помощь очень ценится, спасибо!

try { 
     $conn = new PDO("mysql:host=localhost;dbname=$dbname", $db->id, $db->pass); //connect to db 
     $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); //error modes  

     $temp = $conn->prepare('CREATE TEMPORARY TABLE tempId (user_id VARCHAR(17) PRIMARY KEY, company_id VARCHAR(17))'); 
     $temp->execute(); 
     $temp = $conn->prepare('INSERT INTO tempId(user_id, company_id) VALUES(:user_id, UUID_SHORT())'); 
     $temp->bindParam(':user_id', $_SESSION['username'], PDO::PARAM_INT); 
     $temp->execute(); 
     $temp = $conn->prepare('SELECT company_id FROM tempId WHERE user_id = :user_id '); 
     $temp->bindParam(':user_id', $_SESSION['username'], PDO::PARAM_INT); 
     $temp->execute(); 
     $tempResult= $temp->fetchAll(PDO::FETCH_ASSOC); 
     $company_id = $tempResult->company_id; 


    // $result[1] =$_SESSION('username'); 
    } catch(PDOException $e) { 

     $result = $e->getMessage(); 
    } 
    print json_encode($company_id); 
+1

вы начали сессию? Использовать отчет об ошибках –

+0

Да, сеанс не является проблемой.Как я уже сказал, фактические результаты находятся в json_encode ($ tempResult), но по какой-то причине я не могу получить его из $ tempResult-> company_id –

ответ

1

Не уверен, но как только fetchAll возвращает массив, код:.

$company_id = $tempResult->company_id; 

является недействительным, вы должны:

$company_id = $tempResult[0]['company_id']; 

или

$tempResult= $temp->fetch(PDO::FETCH_ASSOC); 
$company_id = $tempResult['company_id']; 
+0

Что делать, если набор результатов пуст? (Если запрос не возвращает какие-либо строки?) – spencer7593

+0

@ spencer7593 Да, конечно, лучше проверить, но если код в целом правильный, и он должен вернуть только одну строку, которую мы только что вставляли, мы можем ее игнорировать на данный момент. – Alex

+0

Фантастический Алекс, который сработал! Правильно он возвращал массив. Большое спасибо, я схожу с ума! –

2

Здесь:

$tempResult= $temp->fetchAll(PDO::FETCH_ASSOC); 

Если fetchAll успешно, то $tempResult будет массив. Для отладки мы можем проверить это, используя удобный var_dump, например.

var_dump($tempResult); 

Если $tempResult является массивом, мне интересно, об этом выражении:

$tempResult->company_id 

Что это возвращение? Что вы ожидаете от этого? Зачем?


EDIT: Я знаю лучше, чем ответить на вопрос, с вопросом, или три вопроса.

Однако, я не могу (с чистой совестью) заставить себя дать «ответ» на проблемы с OP кодой ...

по крайней мере, не без (фигурально) чесать голова задается о фактический SQL, используемый в коде.

Какова цель ВРЕМЕННОГО ТАБЛИЦЫ? Почему в нем есть ВСТАВКА? Почему тип данных UNSIGNED BIGINT (возвращаемый функцией UUID_SHORT()) передается в VARCHAR (17)? Есть ли какая-то причина, по которой мы хотим отменить 1 или 2 цифры, когда функция возвращает 18 или 19 десятичных цифр?

Если цель этого блока кода заключается в возврате значения из функции MySQL UUID_SHORT(), я не понимаю, почему нам требуется более одного оператора. Очевидно, что есть что-то я пропускаю, почему это не было бы достаточно:

try { 
    $conn = new PDO("mysql:host=localhost;dbname=$dbname", $db->id, $db->pass); 
    $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 
    $sth = $conn->prepare('SELECT UUID_SHORT() AS company_id'); 
    $sth->execute(); 
    $company_id = $sth->fetchColumn(); 
} catch(PDOException $e) { 
    //var_dump($e->getMessage); 
} finally { 
    if(isset($sth)){ $sth->close(); } 
    if(isset($conn)){ $conn->close(); } 
} 

(Приложение не будет в большом количестве соединений с базой данных, как это, там будет либо пул соединений, или соединение будет передано в к этой процедуре)

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