我已經閱讀了很多這方面的文章,似乎沒有任何共識.我正在為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