-2

include once を使用した接続が pdo で失敗するのはなぜですか?
接続ページを含むデータベースに接続するとエラーが発生しましたが、接続コードを挿入してインクルードを削除してもエラーは発生しません。何が問題なのですか?

Error Fatal error: Call to a member function prepare() on a non-object in C:\wamp\www\tish\A\view.php on line 167

接続ページ:

<?php
  function connected_Db(){
    try {
      $con = new PDO('mysql:host=localhost;dbname=tish_database;charset=utf8','root','');
    } catch(PDOException $e){
      echo 'Connection failed'.$e->getMessage();
    }
  }
  connected_Db();
?>

他のページに含める方法:

include_once('pdo.inc.php');
connected_Db();
global $con;
4

4 に答える 4

2

まず、接続エラーで例外をスローするように PDO に指示する必要があります。
次に、少なくとも try .. catch を使用しないでください。

したがって、コードは

pdo.inc.php:

<?php
function connected_Db(){
    $dsn  = 'mysql:host=localhost;dbname=tish_database;charset=utf8';
    $opt  = array(
        PDO::ATTR_ERRMODE            => PDO::ERRMODE_EXCEPTION,
        PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC
    );
    return new PDO($dsn,'root','', $opt);
}

(関数パラメータを介して接続オプションを渡すこともできます)

その他のファイル

include_once('pdo.inc.php');
$con = connected_Db();
于 2013-02-27T10:28:20.500 に答える
2

$confunction の外で使用可能にすることはありませんconnected_Db変数のスコープについて学びます。return関数からそれを使用し、次のように使用する必要があります。

require_once 'pdo.inc.php';

$con = connected_Db();

catchこれは、関数が PDO 接続を返すことができない場合、スクリプトを続行する必要がないため、接続エラーを発生させてはならないことも意味します(少なくともそこにはありません)。

于 2013-02-27T10:11:03.000 に答える
1

関数変数をグローバル スコープからグローバルにすることはできません。変数$conは長い間 GC されています。関数が戻ると、割り当てが解除されます。これを試して:

function connected_Db()
{
   return new PDO('mysql:host=localhost;dbname=tish_database;charset=utf8','root','');
}
//global scope:
$con = connect_Db();

globalキーワードの使用を主張する場合は、これは良い考えではありませんが、次のように使用する必要があります。

function connected_Db()
{
    global $con;//use the global var, set at top of function
    $con = new PDO('mysql:host=localhost;dbname=tish_database;charset=utf8','root','');
}
$con = null;// declare global var (optional, but a notice will be issued if not declared)
connect_Db();
var_dump($con);

ご覧のとおり、deceze や YourCommonSense のように、try-catch ブロック (ここでは必要ありません) を削除しました。また、関数呼び出しも実際には必要ないことも示しています。次のように記述した場合、スクリプトは完全に正常に (またはわずかに高速に) 動作します。

//global scope (or whatever scope you need it to be)
$con = new PDO('mysql:host=localhost;dbname=tish_database;charset=utf8','root','');

そうすれば、呼び出す必要のない関数を呼び出すことはありません。

于 2013-02-27T10:13:38.870 に答える
1

使い方globalが間違っています。変数が関数の外側、つまりグローバルスコープにあることを指定するには、関数に入れる必要があります。

例えば

function connected_Db()
{
    global $con;

    $con = null;
    try
    {
       $con = new PDO(...);
    }
    catch(PDOException $e)
    {
        die('Could not connect: '.$e->getMessage());
    }
}

ただし、グローバル スコープから接続を取得するよりも、接続を返す方が適切です。

すなわち

function connected_Db()
{
    try
    {
       return new PDO(...);
    }
    catch(PDOException $e)
    {
        die('Could not connect: '.$e->getMessage());
    }
}
于 2013-02-27T10:19:27.123 に答える