繁体   English   中英

在php中用pdo创建数据库

[英]create database with pdo in php

当我在不使用bind param的情况下创建数据库时,它完美地运行。

$login = 'root';
$password = 'root';
$dsn = "mysql:host=localhost";

$opt = array(
// any occurring errors wil be thrown as PDOException
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
// an SQL command to execute when connecting
PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES 'UTF8'"
);

// Making a new PDO conenction.
$conn = new PDO($dsn, $login, $password,$opt);

$db = $conn->prepare( 'CREATE SCHEMA IF NOT EXISTS account');

$db->execute();      
// End Connection and Return to other files.

但是在应用bindParam之后它无法正常工作。

$db = $conn->prepare( 'CREATE SCHEMA IF NOT EXISTS ?');
$db->bindParam(1,`account`);
$db->execute();  //line 18

显示错误:

Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'NULL' at line 1' in /Applications/MAMP/htdocs/create/index.php:18 Stack trace: #0 /Applications/MAMP/htdocs/create/index.php(18): PDOStatement->execute() #1 {main} thrown in /Applications/MAMP/htdocs/create/index.php on line 18

更新:

<?php
$login = 'root'; // Login username of server host.
$password = 'root'; // Password of server host.
$dsn = "mysql:host=localhost"; // Set up a DSN for connection with Database Frat.
$dbb = 'sale';
$opt = array(
// any occurring errors wil be thrown as PDOException
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
// an SQL command to execute when connecting
PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES 'UTF8'"
);

// Making a new PDO conenction.
$conn = new PDO($dsn, $login, $password,$opt);

$db = $conn->prepare( 'CREATE SCHEMA IF NOT EXISTS ?');
$db->bindParam(1,'$dbb'); //line 17
$db->execute();          

?>

它显示错误:无法通过第17行的引用传递参数2

这里有两个大问题。 第一个是次要的。 这些代码行永远不会工作:

$db->bindParam(1,`account`);
$db->bindParam(1,'$dbb'); //line 17

这是因为它们都试图将bindParam作为字符串调用。 这是不可能的。 bindParam需要对变量的引用。 这就是为什么你得到一个“无法通过引用传递参数2”的错误:你只能通过引用传递变量

但是,这些中的任何一个都可以工作:

$db->bindParam(1, $dbb); // call bindParam on a variable
$db->bindValue(1, 'account'); // call bindValue on a string literal

然而,更根本的问题是你对准备好的陈述的理解。 预处理语句的想法不是简单地将字符串替换为另一个字符串。 它基本上是关于查询结构与数据的分离。 表的名称被视为查询结构的一部分,而不是数据的一部分。 您需要将表名放在原始查询中。 你的第一个代码就是这样做的方法。

$db = $conn->prepare( 'CREATE SCHEMA IF NOT EXISTS account');

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM