我仍在尝试将mysql_*的东西转换为PDO和准备好的语句。在整个网络中做到这一点真的很困难,但我并没有放弃,我遇到了一些问题。
我的问题是关于一个函数中的多个mysql_query()
命令。因此,当我在代码中有这样的东西时:
if (something)
{
mysql_query("UPDATE account SET pass=$pass WHERE id=$id");
mysql_query("UPDATE account_2 SET lock=$lock WHERE id=$id");
mysql_query("UPDATE account_3 SET surname=$surname WHERE id=$id");
}
并希望将其转换为PDO准备好的声明。我已经知道我必须做这样的事情:
if (something)
{
$stmt = $db->prepare("UPDATE account SET pass=:pass WHERE id=:id");
$stmt->bindValue(':pass', $pass, PDO::PARAM_STR);
$stmt->bindValue(':id', $id, PDO::PARAM_INT);
$stmt->execute();
}
我实际上有两个问题:是否可以将密码绑定为字符串(PDO::P ARAM_STR)?当我添加其他语句时,因为它有更多的查询,我应该像 $stmt 2 一样以不同的方式命名它们,还是在执行它时我只能像这样一直$stmt?
if (something)
{
$stmt = $db->prepare("UPDATE account SET pass=:pass WHERE id=:id");
$stmt->bindValue(':pass', $pass, PDO::PARAM_STR);
$stmt->bindValue(':id', $id, PDO::PARAM_INT);
$stmt->execute();
$stmt = $db->prepare("UPDATE account_2 SET lock=:lock WHERE id=:id");
$stmt->bindValue(':lock', $lock, PDO::PARAM_INT);
$stmt->bindValue(':id', $id, PDO::PARAM_INT);
$stmt->execute();
}
还是我应该这样做?
if (something)
{
$stmt = $db->prepare("UPDATE account SET pass=:pass WHERE id=:id");
$stmt->bindValue(':pass', $pass, PDO::PARAM_STR);
$stmt->bindValue(':id', $id, PDO::PARAM_INT);
$stmt->execute();
$stmt2 = $db->prepare("UPDATE account_2 SET lock=:lock WHERE id=:id");
$stmt2->bindValue(':lock', $lock, PDO::PARAM_INT);
$stmt2->bindValue(':id', $id, PDO::PARAM_INT);
$stmt2->execute();
}
最后还有一个。当我有这样的代码功能/检查时:
if (mysql_query("INSERT INTO account (id, pass, email, request_time, status) VALUES ('".$id."', '".$pass."', '".$mail."', '".time()."', '".$status."')"))
{
blabla
}
如果插入命令首先需要在 PDO 中存在,则如何在 stmt 和 PDO 中使用吸盘检查?
最后一个问题...当我已经在PDO的预准备语句中绑定值时,我以后在代码中仍然需要使用is_numeric()函数吗?
所以总结一下:
1)是否可以将密码绑定为字符串(PDO::P ARAM_STR)?
2)当我添加语句时,因为它有更多的查询,我应该以不同的方式命名它们,如$stmt、$stmt 2、$stmt 3还是每个语句都一样?
3)当我已经在PDO的预准备语句中绑定了Value时,我以后在代码中是否仍然需要使用is_numeric()函数(也许是一些变量作弊)?
谢谢大家
-
是的
-
您可以
$stmt
命名它们,因为您不需要不同的名称(一旦执行,您就完成了,因此您可以根据需要覆盖)。但我不明白的是,你为什么不把它全部放在 1 个语句中而不是 3 个不同的语句中? -
真的不明白你的意思吗?如果您需要知道它是否是数字,则需要 is_numeric() 是的。
您可以检查它是否使用 $stmt->execute();
成功执行,因为如果成功,它会返回 true。
所以你会做的
$passed = $stmt->execute();
if($passed)
{
//fetch
}
下面是一个简单的示例:
$stmt = $db->prepare("UPDATE `account`
SET account.pass = ?
WHERE account.id = ?
LIMIT 1");
$stmt->bindParam(1, $pass, PDO::PARAM_STR);
$stmt->bindParam(2, $id, PDO::PARAM_INT);
$stmt->setFetchMode(PDO::FETCH_ASSOC);
if($stmt->execute())
{
$stmt->fetch(); //fetch your data
}
else
{
//error
}
为什么不像这样在 1 个查询中执行此操作:
<?php
if (something){
$stmt = $db->prepare("UPDATE account SET pass=:pass, lock=:lock, surname=:surname WHERE id=:id");
$stmt->bindValue(':pass', $pass, PDO::PARAM_STR);
$stmt->bindValue(':lock', $lock, PDO::PARAM_INT);
$stmt->bindValue(':surname', $surname, PDO::PARAM_STR);
$stmt->bindValue(':id', $id, PDO::PARAM_INT);
$stmt->execute();
}
?>
您也可以创建一个将处理所有更新的函数,然后您只需要传递一个值数组,并且该函数可在整个脚本中重用,当您可以调用单个函数时,为什么要为每个更新查询重复代码。
<?php
/**
* Update multiple rows
*
* @param string $table
* @param array $values
* @param sring $pk
* @param int $id
*/
function Update($table, $values){
//connect ect here
$fieldnames = array_keys($values[0]);
$fields = '';
foreach($fieldnames as $keys){
//continue as id, id is used in the WHERE clause
if($keys=='id'){continue;}
$fields .= $keys.'=:'.$keys.', ';
}
$fields = trim($fields,', ');
/*** put the query together ***/
$sql = "UPDATE {$table} SET {$fields} WHERE id=:id";
/*** prepare and execute $db being your PDO connection object ***/
$statement = $db->prepare($sql);
foreach($values as $vals){
$statement->execute($vals);
}
}
$updates = array(array('id'=>1,'pass'=>'password1','lock'=>1,'surname'=>'Foo'),
array('id'=>2,'pass'=>'password2','lock'=>2,'surname'=>'Bar'),
array('id'=>3,'pass'=>'password3','lock'=>3,'surname'=>'Cherone'));
Update('account', $updates);
?>
if(something){
$stmt = $db->prepare("UPDATE account SET pass=:pass WHERE id=:id");
try{
$flag = $stmt->execute(array(":pass"=>$pass,":id"=>$id));
}catch(PDOException $e){
do something;
}
if(!(bool)$flag){
$errorInfo = $stmt->errorInfo();
do something;
}
$stmt2 = $db->prepare("UPDATE account_2 SET lock=:lock WHERE id=:id");
try{
$flag2 = $stmt->execute(array(":lock"=>$lock,":id"=>$id));
}catch(PDOException $e){
do something;
}
if(!(bool)$flag2){
$errorInfo = $stmt2->errorInfo();
do something;
}
}
$query0 = "INSERT INTO account (id, pass, email, request_time, status) VALUES (:id,:pass,:mail,:time,:status)";
$pQuery0 = $db->prepare($query)
try{
$flag0 = $stmt->execute(array(":pass"=>$pass,":id"=>$id,":mail"=>$mail,":time"=>$time,":status"=>$status));
}catch(PDOException $e){
do something;
}
if((bool)$flag2){
do something
}