2016-12-26 47 views
-1

对于php来说很新,并且在从外部配置文件加载值方面存在问题。我将它用于我的数据库连接,有时它会返回值,但有时它会返回null。我一直在与此战斗数小时,似乎无法找到任何信息。外部文件的格式是这样外部配置文件始终没有加载数据

[database] 
db_name = "atmc_timesheet" 
db_user = "username" 
db_pass = "password" 

我访问它像这样

function connect_db() 
{ 
    $ini = parse_ini_file("../../../atmc_timesheet_config.ini", TRUE); 

    $dbhost = 'localhost'; 
    $db_name = $ini['database']['db_name']; 
    $user_name = $ini['database']['db_user']; 
    $pass = $ini['database']['db_pass']; 

    $dsn = "mysql:dbname=$db_name;host=$dbhost"; 

    try { 
     $pdo = new PDO($dsn, $user_name, $pass); 
     $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 
     return $pdo; 
    } 
    catch (Exception $e) { 
     echo "Error : ".$e->getMessage(); 
    } 

} 

它适合我的登录脚本,但接下来的查询我跑空返回的数据。这两个函数都在同一个php文件中,所以它不是一个错误的路径错误。有什么想法吗?

工作脚本是

function get_login($username) 
{ 
    $pdo = connect_db(); 
    $stmt = $pdo->prepare('SELECT * from tblemployees where username = :username'); 
    $stmt->execute(['username' => $username]); 
    $user = $stmt->fetch(); 
    $stmt = null; 
    $pdo = null; 
    return $user; 
} 

非工作之一是

function get_events_for_calendar($userid) 
{ 
//Gets all userid rows 
    $pdo = connect_db(); 
    $sql = "Select * from tblevents where (employeeId = :uid) order by eventId desc;"; 
    $stmt = $pdo->prepare($sql); 
    $stmt->bindvalue(':uid', $userid); 
    $result = $stmt->execute(); 
    $temp_array = array(); 
    $event_array = array(); 
//fetches records and puts in array 
    while ($record = $result->fetch()){ 
    $temp_array[] = array('id' => $record['eventId'], 'empolyeeid' => $record['employeeId'], 'rh' => $record['rh'], 'oh' => $record['oh'], 
     'inventory' => $record['inventory'], 'empapproved' => $record['empapproved'], 'mgrapproved' => $record['mgrapproved'], 
     'acctapproved' => $record['acctapproved'],); 
     $var_dump($temp_array); 
    } 

回波json_encode($ event_array); }

不工作的那个从用户名和密码的ini文件中获得空值,但是获取主变量的信息。

即使两个查询都在同一个php文件中,它仍未找到第二个查询上的文件。是否可能没有关闭ini文件,这是错误的原因。在parse_ini之后,我找不到任何有关关闭的信息。任何想法为什么它不会找到它。

+0

嗯找到PDO的详细信息,以及什么是你的工作的登录脚本,什么是返回null“下查询”?不能真正告诉你目前提供什么。 – TimBrownlaw

+0

看起来你正试图在每个查询之前建立一个新的PDO连接,这将成为anice问题。那是我第一次猜测是什么造成的。你应该让你的数据库连接变量singleton – kunruh

+0

就像我说的,我是新来的PHP,但我会研究。 – Mike

回答

0
  • 当前问题是,你正在使用的路径是相对于当前脚本,因此并不总是指向同一个地方。
  • 您的问题是错误的错误报告。一旦设置正确,它会告诉你所有的错误,包括你正在使用的错误路径。
  • 你的额外问题是每次调用connect_db都会连接。
  • 另一个问题是你不设置连接字符集,这是非常重要的。

下面您可以找到编辑后的版本。它只连接一次,它正在使用脚本的绝对路径。你也不会编辑路径。正确的字符集也被设置 有关错误报告的信息,您可以在链接的问题中找到。
你可以在我的PDO tutorial

function connect_db() 
{ 
    static $pdo; 
    if (!$pdo) 
    { 
     $ini = parse_ini_file($_SERVER['DOCUMENT_ROOT']."path/from/root/atmc_timesheet_config.ini", TRUE); 

     $dbhost = 'localhost'; 
     $dbcharset = 'utf8'; 
     $db_name = $ini['database']['db_name']; 
     $user_name = $ini['database']['db_user']; 
     $pass = $ini['database']['db_pass']; 

     $dsn = "mysql:dbname=$db_name;host=$dbhost;charset=$dbcharest"; 
     $pdo = new PDO($dsn, $user_name, $pass); 
     $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 
    } 
    return $pdo; 
} 
+0

这个答案适合我。您关于唯一正确的pdo教程的页面实际上是我开始编写此项目时阅读的第一篇。这对我来说只是一个新来的。NET环境,因为php在数据库方面似乎需要一种新的思维方式。我感谢所有帮助我设定正确的道路。 – Mike