Heroku PHP:通过Herrera PDO连接到ClearDB

时间:2014-09-29 00:47:15

标签: php heroku pdo cleardb

我已经阅读了几个关于通过Heroku使用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();

我不确定到底出了什么问题,但我知道它与db连接有关,因为当我发表评论时,“Hello”这个词显示在我的远程站点上。

感谢任何帮助。谢谢。

1 个答案:

答案 0 :(得分:1)

问题

您在连接字符串中使用了单引号:

如果您写下以下内容:

"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();
}