天天看點

php 判斷pdo連接配接成功,php – 我需要确認成功的PDO連接配接

我已經閱讀了很多這方面的文章,似乎沒有任何共識.我正在為Web應用程式編寫一個開源通用安裝程式,我需要确認一個成功的PDO連接配接.它需要測試PDO連接配接,然後它将編寫實際的config / init檔案.檔案編寫部分工作正常,但我似乎無法得到PDO真正連接配接的具體驗證.如果表單為空,它表示已連接配接,如果表單中的某些資訊正确,則表示已連接配接.如何清楚地表明pdo憑據是否正确?我會給你一個(精簡版)我正在做的事情.

表格:

Please fill in your database credentials

Database Host

Database User

Database Password

Database Name

PHP

if (!empty($_POST)) {

$dbh=$_POST['dbh']; //db host

$dbu=$_POST['dbu']; //db username

$dbp=$_POST['dbp']; //db password

$dbn=$_POST['dbn']; //database name

//If Testing

if (!empty($_POST['test'])) {

$dsn = "mysql:host=$dbh;dbname=$dbn;charset=utf8";

$opt = array(

PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,

PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC

);

$pdo = new PDO($dsn, $dbu, $dbp, $opt);

}

//todo: If Submitted, a bunch more logic here

}

?>

解決方法:

如果存在任何連接配接錯誤,将抛出PDOException對象.

try {

$pdo = new PDO($dsn, $dbu, $dbp, $opt);

} catch (PDOException $e) {

// bad connection

}

要驗證主機名,資料庫名和登入憑據等資料是否正确,必須強制使用者不要将這些資料留白.實際上,完全可以與主機建立連接配接,這是因為mysql允許建立具有與任何使用者名比對的空白使用者名(空字元串)的帳戶.

另外,為了避免dsn字元串中的參數注入(例如,名為foo; port = 123的資料庫名稱),您至少應檢查連接配接選項中是否存在分号或NULL位元組(作為主機e資料庫名稱) ).

function test_mysql_connection($host, $dbname, $username, $password = null) {

if (empty($host) || empty($dbname) || empty($username)) {

// those parameters MUST NOT be empty

throw new InvalidArgumentException('Host, database name and username are required.')

}

try {

$pdo = new PDO(build_mysql_dsn_safely($host, $dbname), $username, $password);

return $pdo;

} catch (PDOException $e) {

// bad connection

return false;

}

}

function build_mysql_dsn_safely($host, $dbname = null, $charset = null, $port = null)

{

static $bad_chars = array(';', '=', "\0");

$vars = array_filter(array(

'host' => $host,

'dbname' => $dbname,

'charset' => $charset,

'port' => $port,

));

foreach($vars as $param => $data) {

foreach ($bad_chars as $bad_char) {

if (strpos($data, $bad_char) !== false) {

throw new InvalidArgumentException(sprintf(

'Connection options "%s" contains an invalid value.', $param

));

}

}

}

return 'mysql:'.implode(';', array_map(function($optkey, $optval) {

return $optkey.'='.$optval;

}, array_keys($vars), $vars));

}

if($pdo = test_mysql_connection($_POST['dbh'], $_POST['dbu'], $_POST['dbn'], $_POST['dbp'])) {

// connection established

}

标簽:php,mysql,pdo

來源: https://codeday.me/bug/20190609/1201660.html