-1

クエリに $dbh1 を必要とするすべての php ファイルで $dbh1 を使用できるようにするのに問題があります。クエリが実行されるこのファイルで「global $dbh1」を使用してみました。

私は4つのファイルを持っています:testswitchDB3.php(メイン)、testconnect.php、login.php、およびtestnumcards.php

login.php および testconnect.php によって実行されるようにデータベースが接続されると。両方のファイルが機能しています

したがって、testnumcards.php に "global $dbh1" を適用すると、$dbh1 が作成され、使用可能になります。

しかし、うまくいきません。以下は私のコードです。

testwitchDB3.php

<!DOCTYPE html>
<html>
<head>
    <title>Test the switching responses between databases using buttons</title>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
    <link rel="stylesheet" href="../dojo1_8/dijit/themes/soria/soria.css"/>
    <link rel="stylesheet" href="../common.css"/>
    <style type="text/css">
        html, body 
    {
            width: 100%;
            height: 100%;
            margin: 5px;
            padding: 0px;
            overflow: hidden; /* No Scrollbar */
        }
    </style>
    <script>            
    var dojoConfig =
        {
              parseOnLoad: true,
              isDebug: true,
              async: true,//
              locale : "en-us"//
        }; 
    </script>
    <script src='../dojo1_8/dojo/dojo.js'></script>
</head>

<body class="soria">
<div id="main_bContainer" data-dojo-type="dijit.layout.BorderContainer" data-dojo-props="design:'sidebar'">
<div id="cp_Center" data-dojo-type="dijit/layout/ContentPane" data-dojo-props="region:'center'">
<table>
    <tr>
     <td>
      <div id=btn1></div><!--for testdata2060_03-->
     </td>
     <td>
      <div id=btn2></div><!--for testdata2060_10-->
     </td>
     <td>
      <div id=btn3></div><!--for testdata2060_05-->
     </td>
    </tr>
    <tr>
     <td>
      <div id=btn4></div><!--for testdata2060_03-->
     </td>
     <td>
      <div id=btn5></div><!--for testdata2060_10-->
     </td>
     <td>
      <div id=btn6></div><!--for testdata2060_05-->
     </td>
    </tr>
    <tr>
     <td>
      <div id=btn7></div><!--for testdata2060_03-->
     </td>
     <td>
      <div id=btn8></div><!--for testdata2060_10-->
     </td>
     <td>
      <div id=btn9></div><!--for testdata2060_05-->
     </td>
    </tr>
 </table>
<div id=statement></div>
</div><!--cp_Center-->
</div><!--main_bContainer-->

<script>
    require(["dojo/parser", "dijit/layout/BorderContainer", "dijit/form/Button",
    "dojo/on", "dijit/form/Select", "dojo/store/Memory", "dojo/request", 
    "dojo/dom", "dojo/dom-construct", "dojo/domReady!"],
    function(parser, BorderContainer, Button, on, Select, Memory, request, dom, 
    domConstruct)
    {var commonDB = "nameless"; function connect(commonDB)
        {request.post("testconnect.php",
            {data:{nameDB : commonDB}
            //,handleAs:"json"//without the use of "handleAs:JSON" as it needs only 
            confirnation or not 
             }).then
        (function(connect)
            {console.debug("data read as: ", connect);
    if(connect)//as true or false as indicated in login.php 
            {alert("Successfully login and connected");
            switch(commonDB)
                {
                 case 'testdata2060_03':
                    btn4.set('disabled', false);
                    btn5.set('disabled', true);
                    btn6.set('disabled', true);
                    btn7.set('disabled', false);
                    btn8.set('disabled', true);
                    btn9.set('disabled', true);
                    break;
                 case 'testdata1970_11':
                    btn4.set('disabled', true);
                    btn5.set('disabled', false);
                    btn6.set('disabled', true);
                    btn7.set('disabled', true);
                    btn8.set('disabled', false);
                    btn9.set('disabled', true);
                    break;
                 case 'testdata1970_05':
                    btn4.set('disabled', true);
                    btn5.set('disabled', true);
                    btn6.set('disabled', false);
                    btn7.set('disabled', true);
                    btn8.set('disabled', true);
                    btn9.set('disabled', false);
                    break;
                }}  
             else
                alert("Attempt to login and connect is NOT successful");
                },


            (
              function(error)
                {
                    alert("Test's Error:"+error);
                    console.debug(error);
                }
        );
       }

       function card(commonDB)
        {request.post("testnumcards.php",
          {
          //{data:{xxx:yyy},
           handleAs: "json"
          }).then
         (function(response)
             {alert("The number of the distinct catds for "+commonDB+" is "+response);
               dom.byId("statement").innerHTML = "The number of the distinct catds for
               "+commonDB+" is "+response;
              },
          function(error)
              {alert("Test's Error:"+error);
               console.debug(error);
              }
         )}

/*
function test()
{
}
*/

var btn1 = new Button // Button, not button
({  label: "testdata2060_03",
    onClick: function()
     {
         console.log("Console Log: Button1 has been clicked.");
         connect('testdata2060_03');
     }
 },"btn1"); 
btn1.startup();

var btn2 = new Button
({label: "testdata1970_11"
 },"btn2");
btn2.startup();

var btn3 = new Button
({label: "testdata1970_05"
  },"btn3");
btn3.startup();

var btn4 = new Button // Button, not button
({label: "Number of cards",
    disabled: true
 },"btn4"); 
btn4.startup();

var btn5 = new Button
({label: "Number of cards",
    disabled: true
 },"btn5");
btn5.startup();

var btn6 = new Button
({label: "Number of cards",
    disabled: true
 },"btn6");
btn6.startup();

var btn7 = new Button // Button, not button
({label: "Number of tests",
    disabled: true
 },"btn7"); 
btn7.startup();

var btn8 = new Button
({label: "Number of tests",
   disabled: true
},"btn8");
btn8.startup();

var btn9 = new Button
({label: "Number of tests",
   disabled: true
},"btn9");
btn9.startup();

/*on(btn1, 'click', function()
{console.log("Console Log: Button1 has been clicked.");
 connect('testdata2060_03');
});
*/

on(btn2, 'click', function()
{console.log("Console Log: Button2 has been clicked.");
connect('testdata1970_11');
});

on(btn3, 'click', function()
{console.log("Console Log: Button3 has been clicked.");
connect('testdata1970_05');
});

on(btn4, 'click', function()
{console.log ("Console Log: Button4 has been clicked.");
card();
});

on(btn5, 'click', function()
{console.log("Console Log: Button5 has been clicked.");
test();
});

on(btn6, 'click', function()
{console.log("Console Log: Button6 has been clicked.");
card();
});

on(btn7, 'click', function()
{console.log("Console Log: Button7 has been clicked.");
test();
});

on(btn8, 'click', function()
{console.log("Console Log: Button8 has been clicked.");
card();
});

on(btn9, 'click', function()
{console.log("Console Log: Button9 has been clicked.");
test();
});

});
</script>
</body>

次はtestconnect.phpです

<?php
global $dbh1;
$dbname = $_POST['nameDB']; 
require_once '../scripts/login.php';
echo $connect;
?>

次はlogin.phpです

<?php
    global $dbname;
    global $dbh1;

    $dbh1 =  null; 
    $dsn ="mysql:host=localhost; dbname=$dbname";
    $user ='root';
    $pswd ='';

 try
    {
     $dbh1 = new PDO($dsn, $user, $pswd, array(PDO::ATTR_TIMEOUT => "10",// 10 seconds
     PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION)); // connect to DB, declared as global variable!
     $connect = TRUE;
    }

catch(PDOException $err)
    {
     $alertmsg = $err->getMessage();
     $connect = FALSE;
    }

echo $connect;      
?>

次はtestnumcards.phpです

<?php
 global $dbh1;

 $stmt = $dbh1->prepare("select count(distinct mfg_code)as mfg_code from test");

 try
  {
    $stmt->execute();
  }

catch(PDOException $err)
 {
   $alertmsg = $err->getMessage();
 }

$num = $stmt->fetch(PDO::FETCH_ASSOC);
echo $num['mfg_code'];

?>

JsFiddleを参照できますが、PHP のサポートなしでは使用できません。

4

1 に答える 1

1

ファイルを次のように開始する必要があります

<?php
require("login.php"); 

それらのスクリプトがすでにそのファイルをインクルードまたは要求していない限り、すべての php スクリプトで接続を使用できるようにします。

リクエストが終了すると接続が閉じられるため、リクエストごとに接続を作成する必要があります。そのため、testnumcards.php をリクエストすると、そのリクエストで設定されていないため、グローバルを宣言する $dbh1 はありません

編集

PHP はリクエスト固有の言語であり、サーバーに新しいリクエストを送信するたびに、接続を再度作成して変数を設定する必要があります。リクエスト間ですべてのリソースが閉じられているため、あるページは別のページで作成されたリソースを認識しません。

したがって、page1.php に移動してデータベースに接続すると、後で page2.php に移動すると、その接続を再度作成しない限り、データベースに接続されません。page1.php が終了して接続が閉じられたら、page2.php で再度接続する必要があります。

これが、ほとんどのスクリプトが必要な接続やその他のリソースを設定するファイルを要求することから始まる理由です。

于 2013-07-23T09:45:35.450 に答える