2

Heroku 経由での ClearDB の使用に関するいくつかの質問を読みましたが、どれも私の問題を解決するための十分なガイダンスを提供していませんでした。

だから、私の問題...

現在、以下に配置するコードを除いて、基本的に空の PHP アプリケーションをデプロイしています。Herrera\PDOServiceProvider()基本的に、私が読んだClearDBに接続するために使用しようとしています。また、Postgre を介して ClearDB を使用するだけで、Heroku PHP チュートリアルと基本的に同じです。

空白のページが表示されるため、どこかでエラーが発生します。チュートリアルでは、"hello" という 1 つの単語が表示されるはずですが、現在は表示されていません。

<?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();

何が問題なのか正確にはわかりませんが、コメントアウトすると「Hello」という単語がリモートサイトに表示されるため、データベース接続に関係があることはわかっています。

どんな助けでも大歓迎です。ありがとうございました。

4

1 に答える 1

1

問題

接続文字列で一重引用符を使用しました。

次のように記述した場合:

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

PHP は次のように解析します。

mysql:host='.localhost.'; dbname='.test.';

それ以外の

mysql:ホスト=localhost; データベース名=テスト;

解決:

$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();
}
于 2014-09-29T04:06:40.300 に答える