Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/269.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 我可以包括一个pdo连接吗_Php_Pdo - Fatal编程技术网

Php 我可以包括一个pdo连接吗

Php 我可以包括一个pdo连接吗,php,pdo,Php,Pdo,我只是想在我的开发中使用PDO,我在大多数教程中看到,对于每个db查询,连接都是开放的,如下面的Jeffery Ways示例所示 $id = 5; try { $conn = new PDO('mysql:host=localhost;dbname=myDatabase', $username, $password); $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); $stmt

我只是想在我的开发中使用PDO,我在大多数教程中看到,对于每个db查询,连接都是开放的,如下面的Jeffery Ways示例所示

$id = 5;
try {
    $conn = new PDO('mysql:host=localhost;dbname=myDatabase', $username, $password);
    $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);   

    $stmt = $conn->prepare('SELECT * FROM myTable WHERE id = :id');
    $stmt->execute(array('id' => $id));

    while($row = $stmt->fetch()) {
        print_r($row);
    }
} catch(PDOException $e) {
    echo 'ERROR: ' . $e->getMessage();
}
我是否仍可以在外部文件中建立连接,并像前面的过程编码一样将其包含在页面顶部,然后在页面中执行下面的查询

<?php include 'includes/db.php';?>


简短的回答是肯定的

如果您是使用OOPHP的farmilier,那么创建一个包装器类来帮助运行查询可能是值得的,但只需在文件中创建连接并包含它,就可以完成任务

在上面的例子中,你可以把

try {
    $conn = new PDO('mysql:host=localhost;dbname=myDatabase', $username, $password);
    $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);   

    }
} catch(PDOException $e) {
    echo 'ERROR: ' . $e->getMessage();
}
进入db.php并运行查询

 $stmt = $conn->prepare('SELECT * FROM myTable WHERE id = :id');
 $stmt->execute(array('id' => $id));
无论你需要什么

可能还值得一提的是,您不必在PDO中使用预先准备好的语句,这可以加快编码速度,但是如果您希望这样做,我将高度推荐一个数据库包装器类

未准备的报表

<?php
try {
    $conn = new PDO('mysql:host=localhost;dbname=myDatabase', $username, $password);
    $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);   

    }
} catch(PDOException $e) {
    echo 'ERROR: ' . $e->getMessage();
}

$query = "
SELECT 
  col_1, 
  col_2
FROM
  table_1
WHERE
  col_3 = " . $conn->quote($_POST['input']); //the quotr is important, it escapes dangerous characters to prevent SQL injection


//this will run the query for an insert this is all thats needed
$statement = $conn->query($query);

//fetch single col
$col = $statement->fetch(PDO::FETCH_ASSOC);

//fetch all collums
$cols = $statement->fetchAll(PDO::FETCH_ASSOC);

简而言之,答案是肯定的

如果您是使用OOPHP的farmilier,那么创建一个包装器类来帮助运行查询可能是值得的,但只需在文件中创建连接并包含它,就可以完成任务

在上面的例子中,你可以把

try {
    $conn = new PDO('mysql:host=localhost;dbname=myDatabase', $username, $password);
    $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);   

    }
} catch(PDOException $e) {
    echo 'ERROR: ' . $e->getMessage();
}
进入db.php并运行查询

 $stmt = $conn->prepare('SELECT * FROM myTable WHERE id = :id');
 $stmt->execute(array('id' => $id));
无论你需要什么

可能还值得一提的是,您不必在PDO中使用预先准备好的语句,这可以加快编码速度,但是如果您希望这样做,我将高度推荐一个数据库包装器类

未准备的报表

<?php
try {
    $conn = new PDO('mysql:host=localhost;dbname=myDatabase', $username, $password);
    $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);   

    }
} catch(PDOException $e) {
    echo 'ERROR: ' . $e->getMessage();
}

$query = "
SELECT 
  col_1, 
  col_2
FROM
  table_1
WHERE
  col_3 = " . $conn->quote($_POST['input']); //the quotr is important, it escapes dangerous characters to prevent SQL injection


//this will run the query for an insert this is all thats needed
$statement = $conn->query($query);

//fetch single col
$col = $statement->fetch(PDO::FETCH_ASSOC);

//fetch all collums
$cols = $statement->fetchAll(PDO::FETCH_ASSOC);
是,示例:

db.php

<?php
$dsn = 'mysql:dbname=testdb;host=127.0.0.1';
$user = 'dbuser';
$password = 'dbpass';

try {
    $dbh = new PDO($dsn, $user, $password);
    $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch (PDOException $e) {
    echo 'Connection failed: ' . $e->getMessage();
}

?>

发件人:

然后只包括db.php。我将我的连接命名为$PDO,这似乎更为含蓄,尤其是当您在此基础上构建准备好的语句时。

是的,例如:

db.php

<?php
$dsn = 'mysql:dbname=testdb;host=127.0.0.1';
$user = 'dbuser';
$password = 'dbpass';

try {
    $dbh = new PDO($dsn, $user, $password);
    $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch (PDOException $e) {
    echo 'Connection failed: ' . $e->getMessage();
}

?>

发件人:


然后只包括db.php。我把我的连接命名为$PDO,似乎更为含蓄,尤其是当你在上面构建一个准备好的语句时。

不知道Jeffery是谁,但如果他真的要为每个查询打开一个新的连接,他显然没有任何线索

打开一个单独的连接并在整个应用程序中使用它并不是“您可以”的事情,而是实际上唯一的方法

所以-是的,你做得对

还要注意的是,这件事与

try {
    ...
} catch(PDOException $e) {
    echo 'ERROR: ' . $e->getMessage();
}
杰弗里教你的又错了。切勿使用
catch
回显错误消息。PHP将更好地处理它

所以,您的代码应该是这样的

include 'includes/db.php';

$stmt = $pdo->prepare('SELECT * FROM myTable WHERE id = :id');
$stmt->execute(array('id' => $id));

while($row = $stmt->fetch()) {
    print_r($row);
}
$dsn = "mysql:host=localhost;dbname=test;charset=utf8";
$opt = array(
    PDO::ATTR_ERRMODE            => PDO::ERRMODE_EXCEPTION,
    PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC
);
$pdo = new PDO($dsn, $username, $password, $opt);
而db.php必须包含如下内容

include 'includes/db.php';

$stmt = $pdo->prepare('SELECT * FROM myTable WHERE id = :id');
$stmt->execute(array('id' => $id));

while($row = $stmt->fetch()) {
    print_r($row);
}
$dsn = "mysql:host=localhost;dbname=test;charset=utf8";
$opt = array(
    PDO::ATTR_ERRMODE            => PDO::ERRMODE_EXCEPTION,
    PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC
);
$pdo = new PDO($dsn, $username, $password, $opt);
还要注意,当使用这个PDO对象时,您必须知道


进一步阅读:

不知道杰弗里的方式是什么,但如果他真的说要为每个查询打开一个新的连接,他显然没有任何线索

打开一个单独的连接并在整个应用程序中使用它并不是“您可以”的事情,而是实际上唯一的方法

所以-是的,你做得对

还要注意的是,这件事与

try {
    ...
} catch(PDOException $e) {
    echo 'ERROR: ' . $e->getMessage();
}
杰弗里教你的又错了。切勿使用
catch
回显错误消息。PHP将更好地处理它

所以,您的代码应该是这样的

include 'includes/db.php';

$stmt = $pdo->prepare('SELECT * FROM myTable WHERE id = :id');
$stmt->execute(array('id' => $id));

while($row = $stmt->fetch()) {
    print_r($row);
}
$dsn = "mysql:host=localhost;dbname=test;charset=utf8";
$opt = array(
    PDO::ATTR_ERRMODE            => PDO::ERRMODE_EXCEPTION,
    PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC
);
$pdo = new PDO($dsn, $username, $password, $opt);
而db.php必须包含如下内容

include 'includes/db.php';

$stmt = $pdo->prepare('SELECT * FROM myTable WHERE id = :id');
$stmt->execute(array('id' => $id));

while($row = $stmt->fetch()) {
    print_r($row);
}
$dsn = "mysql:host=localhost;dbname=test;charset=utf8";
$opt = array(
    PDO::ATTR_ERRMODE            => PDO::ERRMODE_EXCEPTION,
    PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC
);
$pdo = new PDO($dsn, $username, $password, $opt);
还要注意,当使用这个PDO对象时,您必须知道



进一步阅读:

为什么不试试呢?打开同一数据库的多个连接是愚蠢的。。。每次请求都要使用一个连接。为什么不试试呢?打开同一数据库的多个连接是愚蠢的。。。每次请求总是使用一个连接。你说我不必在PDO中使用准备好的语句是什么意思?我可以做与过程性语句相同的语句?有点,你仍然会使用PDO对象,但你不必做整个->准备->执行步骤,我会写一个简单的例子,并将其添加到这个答案中,只需给我10分钟无需担心,非常感谢你的帮助和时间你的答案有两个缺陷。相对较小的一个,
echo'ERROR:“…
因为PHP错误永远不应该被回显,事实上是一个致命的错误:一个关于不使用预处理语句的语句,而这些语句必须是向查询中添加动态语句的唯一方法。谢谢,我认为我可以掌握PDO语句,并且需要使用这种方法。你说我不必在PDO中使用准备好的语句是什么意思?我可以做与过程性语句相同的语句?有点,你仍然会使用PDO对象,但你不必做整个->准备->执行步骤,我会写一个简单的例子,并将其添加到这个答案中,只需给我10分钟无需担心,非常感谢你的帮助和时间你的答案有两个缺陷。相对较小的一个,
echo'ERROR:“…
因为PHP错误永远不应该被回显,事实上是一个致命的错误:一个关于不使用预处理语句的语句,而这些语句必须是向查询中添加动态语句的唯一方法。谢谢,我想我可以掌握PDO语句,并且需要使用该方法。错过了这个,我没想到会在错误处理部分找到它错过了这个,我没想到会在错误处理部分找到它那么我该怎么处理捕获呢?我在不久前的另一个教程中看到过这种情况。所有这些教程都是一派胡言。只有当您要处理错误本身时,才需要处理catch,但决不能只报告一条消息。PHP已经可以做到这一点了,而且是一种更好的方法。那么,我应该用什么方法来处理捕获?我在不久前的另一个教程中看到过这种情况。所有这些教程都是一派胡言。只有当您要处理错误本身时,才需要处理catch,但决不能只报告一条消息。PHP已经可以做到这一点,而且是更好的方法。