2013-05-02 2 views
2

ОК, я вижу некоторые похожие вопросы для моего, но их примеры все используют классы PHP ... у меня нет. Может, в этом проблема? Мне не нужны классы, потому что мой сайт очень прост в этот момент.Объект PDO не входит в функцию

В любом случае, я пытаюсь использовать PDO для подключения к MySQL db. Я подключаюсь к db fine в файле с именем config.php и включаю этот файл в index.php с require_once().

Я могу успешно запросить db из другого файла с именем process.php, но проблема находится внутри функции внутри этого файла; кажется, что мой объект DBO выходит за рамки этой функции.

Вот соответствующие фрагменты кода:

index.php

require_once('./lib/config.php'); 

config.php

// tested and connects fine  
$pdo = new PDO('mysql:host=' . $hostname . ';dbname=' . $dbname, $username, $password, array(
    PDO::ATTR_PERSISTENT => true 
)); 

process.php

Кстати, я использую PDO, потому что у меня была схожая проблема с mysqli, и я стараюсь уйти от mysql, что, очевидно, обесценивается и обескураживается.

EDIT: Я должен был прояснить первый на основе количества ответов, которые я получил по этому поводу: я действительно пытался удар $ PDO как пары к функции, не повез или изменений в сообщении об ошибке.

РЕШЕНИЕ: ОК, очевидно, проблема заключалась в том, что мне нужно было добавить require_once('config.php') в файл process.php. Не знаете, почему (не будет ли он уже включен, когда index.php был запущен первым?). Затем я смог успешно передать $pdo в качестве параметра моей функции и вуаля.

+0

В функции AUTHENTICATE, '$ pdo' выходит за рамки. Передайте его в качестве параметра или объявите его глобальным. – andrewsi

+0

Если вы действительно должны, объявите его как 'global $ pdo;' внутри вашей функции. Вам лучше передать его или поставить 'authenticate' в класс. – Aleph

+0

Используйте соответствующие классы и объекты, а затем используйте инъекцию зависимости. –

ответ

3

Это pretty basic PHP stuff. Переменные внутри функций являются локальными переменными, если вы не используете ключевое слово global для их загрузки. Я полагаю, вы хотите:

function authenticate(PDO $pdo, $u, $p) { 
    $que = $pdo->query('select user_id, user_pass from users where user_name = \'' . $u . '\' limit 1'); 
    //... 
} 

Edit: Если PHP утверждает, что $pdo не является объектом, это не объект, поэтому он действительно не имеет значения, как она передается в функцию. Проверьте переменную сразу перед вызовом authenticate():

var_dump($pdo); 

Без соответствующего кода нет никакого способа, чтобы сказать, почему. (Предполагается, что это правда, что new PDO успешно.)

+0

Да. Я бы откликнулся на подход к передаче объекта PDO функции (это известно как инъекция зависимостей). Он намного чище, чем использование 'global' в функции. –

+0

Да, пожалуйста, см. Мои правки, извините. Должно было сначала прояснить, что прохождение в '$ pdo' в качестве параметра было первым, что я пробовал, без успеха. – hannebaumsaway

+0

Спасибо, Альваро, см. Мое решение. Когда файл config.php был необходим (снова) локально, передача параметров работала так же, как вы сказали. Не уверен, почему мне пришлось требовать config.php дважды, но что угодно. – hannebaumsaway

0

Вам нужно передать объект PDO в качестве параметра к authenticate() функции:

function authenticate(PDO $pdo, $u, $p) { 
    // ..as in the question.. 
} 

Ох, и вы должны использовать держатель место для этого пользователя в запросе , а не конкатенация строк, которая подвержена атакам SQL-инъекций.

+0

Спасибо. Запрос, который вы видите, предназначен для этой цели, а не фактический запрос, который я буду запускать в моем коде :). Не волнуйтесь, все будет правильно экранировано во время выполнения. – hannebaumsaway

0

т.к. $pdo был заявлен за пределами функции authenticate, он не доступен внутри него. Вам нужно либо пройти $ PDO в

function authenticate($u, $p, $pdo) { 
    $que = $pdo->query('...'); 
} 

или объявить его в качестве глобальной внутри функции, чтобы иметь возможность доступа к нему

function authenticate($u, $p) { 
    global $pdo; 
    $que = $pdo->query('...'); 
} 
+0

Извините, пожалуйста, см. Мое редактирование. Я попытался передать '$ pdo' в качестве параметра изначально, без везения. – hannebaumsaway

+0

Вы не можете просто выполнять 'function authenticate ($ u, $ p, $ pdo)', чтобы передавать его, вы должны это делать, вызывая функцию. '$ result = authenticate ($ u, $ p, $ pdo)' – RMcLeod

+0

Я знаю, я сделал обе части. Смотрите мое новое редактирование. Проблема заключалась в отсутствии другого вызова 'require_once()', чтобы получить соединение db в первую очередь. Затем работала парам. – hannebaumsaway

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