Php 使用带变量的PDO更新MySQL

Php 使用带变量的PDO更新MySQL,php,mysql,pdo,Php,Mysql,Pdo,我在php PDO和mysql方面遇到了一个奇怪的问题。 我在这里阅读了其他示例,但当我使用PDO学习MySQL时,我不理解它,也无法解决它 $name = $_POST[ "name" ]; $email = $_POST[ "email" ]; $telefone = $_POST[ "telefone" ]; $endereco = $_POST[ "endereco" ]; $numero = $_POST[ "numero" ]; $bairro = $_POST[ "bairro"

我在php PDO和mysql方面遇到了一个奇怪的问题。 我在这里阅读了其他示例,但当我使用PDO学习MySQL时,我不理解它,也无法解决它

$name = $_POST[ "name" ];
$email = $_POST[ "email" ];
$telefone = $_POST[ "telefone" ];
$endereco = $_POST[ "endereco" ];
$numero = $_POST[ "numero" ];
$bairro = $_POST[ "bairro" ];
$cidade = $_POST[ "cidade" ];

$telefoneHash = make_hash( $telefone );

$PDO = db_connect();

//$PDO->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );
//With this code it gives the error: 'Syntax error or access violation: 1064'
//Without it it does not give an error but does not perform the update

$PDO = $PDO->prepare( 'UPDATE users SET :name, :email, :telefone, :endereco, :numero, :bairro, :cidade WHERE email = :email' ); 

$PDO->bindValue( ':name', $_REQUEST[ 'name' ] );
$PDO->bindValue( ':email', $_REQUEST[ 'email' ] );
$PDO->bindValue( ':telefone', $telefoneHash );
$PDO->bindValue( ':endereco', $_REQUEST[ 'endereco' ] );
$PDO->bindValue( ':numero', $_REQUEST[ 'numero' ] );
$PDO->bindValue( ':bairro', $_REQUEST[ 'bairro' ] );
$PDO->bindValue( ':cidade', $_REQUEST[ 'cidade' ] );
$PDO->execute();

echo $PDO->rowCount() . " records UPDATED successfully";

使用PDO更新的语法是
SET col=:col

使用列名,后跟等号和命名占位符

$PDO = $PDO->prepare( 'UPDATE users SET name = :name, email = :email, 
                       telefone = :telefone, endereco = :endereco, 
                       numero = :numero, bairro = :bairro, cidade = :cidade 
                       WHERE email = :email' ); 
PDO错误处理会清楚地向您显示错误:

还可以使用错误报告

这假设列名与我在这里使用的名称相同

但是,如前所述,为什么要使用
$\u请求
?只需使用在POST数组中指定的变量,并假设表单使用POST方法

$PDO->bindValue(':name', $name);
$PDO->bindValue(':email', $email);
$PDO->bindValue(':telefone', $telefoneHash);
$PDO->bindValue(':endereco', $telefone);
$PDO->bindValue(':numero', $numero);
$PDO->bindValue(':bairro', $bairro);
$PDO->bindValue(':cidade', $cidade);
$PDO->execute();

使用PDO更新的语法是
SET col=:col

使用列名,后跟等号和命名占位符

$PDO = $PDO->prepare( 'UPDATE users SET name = :name, email = :email, 
                       telefone = :telefone, endereco = :endereco, 
                       numero = :numero, bairro = :bairro, cidade = :cidade 
                       WHERE email = :email' ); 
PDO错误处理会清楚地向您显示错误:

还可以使用错误报告

这假设列名与我在这里使用的名称相同

但是,如前所述,为什么要使用
$\u请求
?只需使用在POST数组中指定的变量,并假设表单使用POST方法

$PDO->bindValue(':name', $name);
$PDO->bindValue(':email', $email);
$PDO->bindValue(':telefone', $telefoneHash);
$PDO->bindValue(':endereco', $telefone);
$PDO->bindValue(':numero', $numero);
$PDO->bindValue(':bairro', $bairro);
$PDO->bindValue(':cidade', $cidade);
$PDO->execute();

基本
UPDATE
查询语法为

UPDATE `table_name` SET field_name = FIELD_VALUE
因此,在查询中,您应该执行以下操作:

$PDO = $PDO->prepare( 'UPDATE users SET name = :name, email = :email /* more fields here */ WHERE email = :email2' ); 

$PDO->bindValue( ':name', $_REQUEST[ 'name' ] );
$PDO->bindValue( ':email', $_REQUEST[ 'email' ] );
$PDO->bindValue( ':email2', $_REQUEST[ 'email' ] );
// more binds here
$PDO->execute();

echo $PDO->rowCount() . " records UPDATED successfully";
第一个注意事项:不能两次使用同一占位符名称,这就是为什么我将
:email
替换为
:email2


第二个注意事项:我想,更新
电子邮件是没有用的,通过它您可以找到相同值的记录。

Base
update
查询语法是

UPDATE `table_name` SET field_name = FIELD_VALUE
因此,在查询中,您应该执行以下操作:

$PDO = $PDO->prepare( 'UPDATE users SET name = :name, email = :email /* more fields here */ WHERE email = :email2' ); 

$PDO->bindValue( ':name', $_REQUEST[ 'name' ] );
$PDO->bindValue( ':email', $_REQUEST[ 'email' ] );
$PDO->bindValue( ':email2', $_REQUEST[ 'email' ] );
// more binds here
$PDO->execute();

echo $PDO->rowCount() . " records UPDATED successfully";
第一个注意事项:不能两次使用同一占位符名称,这就是为什么我将
:email
替换为
:email2


第二个注意事项:我想,更新
电子邮件是没有用的,通过它您可以找到相同值的记录。

这不是它的工作原理。在其他示例中,您阅读的
update
语法与您的语法相同?A.)您的更新查询不正确。2.)您应该使用插入而不是更新……可能iii.)如果变量设置在页面顶部,则无需更改为
$\u REQUEST
。@JayBlanchard
插入而不是更新。使用
where
子句?又没有咖啡了?你创造了一堆变量,在这里也没有用。PDO还允许您使用包含所有值的关联数组触发单个
execute
调用,这有助于减少您必须编写的代码量。这不是它的工作方式。在其他示例中,您阅读的
UPDATE
语法与您的语法相同?a.)您的更新查询不正确。2.)您应该使用插入而不是更新……可能iii.)如果变量设置在页面顶部,则无需更改为
$\u REQUEST
。@JayBlanchard
插入而不是更新。使用
where
子句?又没有咖啡了?你创造了一堆变量,在这里也没有用。PDO还允许您使用包含所有值的关联数组触发单个
execute
调用,这有助于减少您必须编写的代码量;我不配;-)u_mulder在回答中指出了另一个关于电子邮件占位符的问题;我不配;-)