我正在使用预处理语句转换为PDO和我,我希望将结果绑定为$stmt->bind_result($email_count);
所以我可以将其放入if语句中以查看电子邮件是否存在但是我是获取与前一个示例相关的错误Fatal error: Call to undefined method PDOStatement::bind_result() in /Applications/XAMPP/xamppfiles/htdocs/imanage/insert.php on line 51
。
我猜测bind_result不是PDO定义的方法,那么我可以使用它吗?
如果有帮助,我的代码如下:
insert.php
<?php
include("connect/class.Database.php");
class Users extends Database {
public function insert() {
$stmt = $this->pdo->prepare("SELECT COUNT(*) FROM users WHERE email=:email");
$stmt->bindParam(":email", $_POST['email']);
$stmt->bind_result($email_count);
$stmt->execute();
$stmt->fetch(PDO::FETCH_ASSOC);
if ($email_count > 0) {
echo "email exisits! click here to try <a href='register'>again</a>";
} else {
//escape the POST data for added protection
$username = isset($_POST['username']) ? $_POST['username'] : null;
$cryptedPassword = crypt($_POST['password']);
$password = $cryptedPassword;
$name = isset($_POST['name']) ? $_POST['name'] : null;
$email = isset($_POST['email']) ? $_POST['email'] : null;
$data = array($username, $password, $name, $email);
$stmta = $this->pdo->prepare("INSERT INTO users (username, password, name, email) VALUES (?, ?, ?, ?)");
$stmta->execute($data);
printf("%d Row inserted.\n", $stmta->row_count);
/* close statement and connection */
$stmta->close();
} // end email_count and insert to table
} // end function
}
?>
连接/ class.Database.php
<?php
// Database connection PDO
class Database {
public function __construct() {
// Connection information
$host = 'localhost';
$dbname = 'imanage';
$user = 'root';
$pass = '';
// Attempt DB connection
try
{
$this->pdo = new PDO("mysql:host=$host;dbname=$dbname", $user, $pass);
$this->pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
echo 'Successfully connected to the database!';
}
catch(PDOException $e)
{
echo $e->getMessage();
}
}
public function __destruct()
{
// Disconnect from DB
$this->pdo = null;
echo 'Successfully disconnected from the database!';
}
}
?>
答案 0 :(得分:5)
然而,你也不需要数数。请避免不必要的操作 - 它们只会毫无理由地膨胀和混淆您的代码。
首先考虑一下,查询需要什么?你真的需要数数吗?不,你真正需要的只是一个标志 - 如果用户存在或没有。因此,请进行查询以返回此类标记。
$stmt = $this->pdo->prepare("SELECT 1 FROM users WHERE email=?");
$stmt->execute(array($_POST['email']));
$exists = $stmt->fetchColumn();
代码的所有其他部分也是如此
//escape the POST data for added protection
你实际上并没有逃脱&#34;此代码块中的任何数据都不添加任何保护。然而,我认为将NULL作为电子邮件插入绝对没有意义。你确定你真的想要吗?
答案 1 :(得分:3)
要快速检索SELECT COUNT()
查询之类的值,请查看PDOStatement::fetchColumn
,例如
$stmt = $pdo->prepare('SELECT COUNT(1) FROM users WHERE email = :email');
$stmt->bindParam(':email', $email);
$stmt->execute();
$email_count = $stmt->fetchColumn();
我还想提供一些进一步的建议。您不应该在类构造函数中创建PDO
连接。这意味着每次实例化扩展Database
的类时,都会创建一个新连接。相反,将PDO
实例作为依赖项传递,例如
abstract class Database {
/**
* @var PDO
*/
protected $pdo;
public function __construct(PDO $pdo) {
$this->pdo = $pdo;
}
}
您的User::insert
方法也是如此。尝试通过方法参数传递任何所需的参数。如果您想开始为您的课程编写单元测试,这将是非常宝贵的
public function insert($email) {
$stmt = $this->pdo->prepare('SELECT COUNT(1) FROM users WHERE email = :email');
$stmt->bindParam(':email', $email);
$stmt->execute();
$email_count = $stmt->fetchColumn();
// and so on
最后,对于仅PHP文件,省略结束PHP标记?>
。这样可以避免在文件末尾意外包含可能发送到浏览器的空格。
答案 2 :(得分:1)
对于那些来这里寻求字面答案的人。
PDOStatement :: bindColumn - 将列绑定到PHP变量
使用相同来源的示例:
function readData($dbh) { $sql = 'SELECT name, colour, calories FROM fruit'; try { $stmt = $dbh->prepare($sql); $stmt->execute(); /* Bind by column number */ $stmt->bindColumn(1, $name); $stmt->bindColumn(2, $colour); /* Bind by column name */ $stmt->bindColumn('calories', $cals); while ($row = $stmt->fetch(PDO::FETCH_BOUND)) { $data = $name . "\t" . $colour . "\t" . $cals . "\n"; print $data; } } catch (PDOException $e) { print $e->getMessage(); } } readData($dbh);
答案 3 :(得分:0)
这是我的自定义功能:
function bindColumns($stmt, $columns){
if(!is_array($columns)) $columns=array($columns);
$count=count($columns);
for($i=0;$i<$count;$i++) $stmt->bindColumn($i+1, $columns[$i]);
}
用法(参考变量):
bindColumns($stmt, array(&$worker_id, &$password, &$salt));