2014-09-29 149 views
1

我已经阅读了几个关于通过Heroku使用ClearDB的问题,但他们都没有提供足够的指导来解决我的问题。Heroku PHP:通过Herrera PDO连接到ClearDB

所以,我的问题......

目前我已经有了部署PHP应用程序,除了我将在下面放置代码基本上是空的。基本上,我试图使用Herrera\PDOServiceProvider()连接到我已阅读的ClearDB。此外,它基本上与使用ClearDB副Postgre的Heroku PHP教程相同。

我收到一个错误,因为我得到一个空白页。教程显示我应该看到一个单词“hello”,现在已经消失了。

<?php 

require('../vendor/autoload.php'); 

use Herrera\Pdo\PdoServiceProvider; 
use Silex\Application; 

$app = new Application(); 
$app['debug'] = true; 

// Register the monolog logging service 
$app->register(new Silex\Provider\MonologServiceProvider(), array(
    'monolog.logfile' => 'php://stderr', 
)); 

// Our web handlers 

$app->get('/', function() use($app) { 
    $app['monolog']->addDebug('logging output.'); 
    return 'Hello'; 
}); 

$dbopts = parse_url(getenv('DATABASE_URL')); 
//print_r(array_values($dbopts)); 
$app->register(new PdoServiceProvider(), 
    array(
     'pdo.dsn' => 'mysql:dbname='.ltrim($dbopts["path"],'/').';host='.$dbopts["host"], 
     'pdo.port' => $dbopts["port"], 
     'pdo.username' => $dbopts["user"], 
     'pdo.password' => $dbopts["pass"] 
    ) 
); 

$host = $app['pdo.dsn.host']; 
$dbname = $app['pdo.dsn.mysql:dbname']; 
$user = $app['pdo.username']; 
$pass = $app['pdo.password'];*/ 

$pdo = new PDO("mysql:host='.$host.'; dbname='.$dbname.';", $user, $pass); 
$statement = $pdo->query("SELECT title FROM news"); 
$row = $statement->fetch(PDO::FETCH_ASSOC); 
echo htmlentities($row['title']); 

app->run(); 

我不知道什么是错的,但我知道它是与数据库连接,因为当我注释掉单词“你好”显示备份在我的远程站点。

任何帮助表示赞赏。谢谢。

回答

0

问题

你已经在你的连接字符串中使用单引号:

,如果你写了以下内容:

"mysql:host='.$host.'; dbname='.$dbname.';" 

PHP会解析:

的MySQL : '本地主机' 主机=; DBNAME =“测试”;的

代替

MySQL的:主机=本地主机; DBNAME =试验;

解决方案:

$pdo = new PDO("mysql:host=$host; dbname=$dbname;", $user, $pass); 

$pdo = new PDO("mysql:host=".$host."; dbname=".$dbname.";", $user, $pass); 

事实的事情,你甚至不需要最后的分号:

$pdo = new PDO("mysql:host=".$host."; dbname=".$dbname, $user, $pass); 

  • 这是一个好主意,打开错误模式和捕捉异常
  • 你需要一个循环,如果你有一个以上的行

代码:

try { 
    $pdo = new PDO("mysql:host=".$host."; dbname=".$dbname, $user, $pass); 
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 
    foreach($pdo->query('SELECT title FROM news') as $row) { 
     echo htmlentities($row['title']); 
    } 
    $pdo = null; 
} catch (PDOException $e) { 
    print "Error!: " . $e->getMessage() . "<br/>"; 
    die(); 
} 
+0

我会尽快尝试这一点,谢谢你为我投入这个时间。对此,我真的非常感激! – 2014-09-29 22:59:45

+0

这可行,但我决定使用一个模板引擎/服务以及一个PDO提供程序,它直接使用$ app而不是将应用程序分解为变量。再次感谢。将来我可能不得不使用它。 – 2014-09-30 01:12:31

+0

欢迎克里斯,如果你再次需要我的帮助,让我知道!谢谢! – meda 2014-09-30 01:17:49