![](/img/trans.png)
[英]How can I make this PDO mysql query with if statements work correctly?
[英]PHP and MySql - How can I make this insert query work?
这是我的代码:
public function cadastrar(Family $family){
var_dump($family); //just to verify
$objDb = new db_con();
$conn = $objDb->getConn();
//REGISTER FAMILY INTO DATABASE
$sql = "insert into family(family_declaracao_renda,
familia_renda_mensal,
family_assinatura_local,
family_assinatura_dia,
family_assinatura_mes,
family_assinatura_ano,
family_deficiente_presente,
family_adaptacao_necessaria_imovel)
values( '$family->getDeclaracaoRendaFamiliar()',
'$family->getRendaBrutaMensal()',
'$family->getAssinaturaLocal()',
'$family->getAssinaturaDia()',
'$family->getAssinaturaMes()',
'$family->getAssinaturaAno()',
'$family->getDeficientePresente()',
'$family->getAdaptacaoImovelNecessaria()')";
//Executar query
if (mysqli_query($conn, $sql)){
echo 'SUCCESS!';
} else {
echo 'ERROR!';
}
}
所以我知道您可以将变量放在VALUES('variable1','variable2')之间 。 我正在从该对象调用类方法,我缺少什么?
准备查询,这是保护数据库免受SQLInjection类型攻击的最佳方法。 它还处理了很多报价问题和其他事项。
$sql = 'INSERT INTO family(
family_declaracao_renda,
familia_renda_mensal,
family_assinatura_local,
family_assinatura_dia,
family_assinatura_mes,
family_assinatura_ano,
family_deficiente_presente,
family_adaptacao_necessaria_imovel
)VALUES(
?,
?,
?,
?,
?,
?,
?,
?
)';
$stmt = mysqli_stmt_init($link);
mysqli_stmt_prepare($stmt, $sql);
mysqli_stmt_bind_param(
$stmt,
'ssssssss', //must be the same as number of argments, types s=string, i=int, d=double/float, b=blob
$family->getDeclaracaoRendaFamiliar(),
$family->getRendaBrutaMensal(),
$family->getAssinaturaLocal(),
$family->getAssinaturaDia(),
$family->getAssinaturaMes(),
$family->getAssinaturaAno(),
$family->getDeficientePresente(),
$family->getAdaptacaoImovelNecessaria()
);
//Executar query
if (mysqli_stmt_execute($stmt)){
echo 'SUCCESS!';
} else {
echo 'ERROR!';
}
即使MySqli程序接口很糟糕,也不难。 考虑使用面向对象的界面,或切换到PDO(我的首选)。 MySqli的OOP界面要容易一些,但我不会为了篇幅而覆盖它。 您可以在PHP.net上查找它,或者我确定那里有一些教程。
一句话警告,我已经好几年没有使用MySqli了(也许是6-8岁),而程序风格甚至更长了。 因此,我无法保证将完全按照我在此处的方式工作。 实际上,我认为我从未使用过MySqli的过程样式。 当我离开mysql_
(这样我就可以做准备好的语句)大约在PHP5.3的中期(2010ish,也许是我完成网页设计学院的一年之后),并且我开始使用OOP(类和对象)几乎完全在我的代码中。 因此,我刚从PHP.net
复制了大多数mysqli
代码。
http://php.net/manual/en/mysqli.prepare.php
在PDO中:
$sql = 'INSERT INTO family(
family_declaracao_renda,
familia_renda_mensal,
family_assinatura_local,
family_assinatura_dia,
family_assinatura_mes,
family_assinatura_ano,
family_deficiente_presente,
family_adaptacao_necessaria_imovel
)VALUES(
:family_declaracao_renda,
:familia_renda_mensal,
:family_assinatura_local,
:family_assinatura_dia,
:family_assinatura_mes,
:family_assinatura_ano,
:family_deficiente_presente,
:family_adaptacao_necessaria_imovel
)';
try{
$stmt = mysqli_stmt_init($link);
$Pdo->prepare($sql)->execute([
':family_declaracao_renda' => $family->getDeclaracaoRendaFamiliar(),
':familia_renda_mensal' => $family->getRendaBrutaMensal(),
':family_assinatura_local' => $family->getAssinaturaLocal(),
':family_assinatura_dia' => $family->getAssinaturaDia(),
':family_assinatura_mes' => $family->getAssinaturaMes(),
':family_assinatura_ano' => $family->getAssinaturaAno(),
':family_deficiente_presente' => $family->getDeficientePresente(),
':family_adaptacao_necessaria_imovel'=> $family->getAdaptacaoImovelNecessaria(),
]);
}catch(PDOException $e){
echo "PDOException[{$e->getCode()}] {$e->getMessage()} in {$e->getFile()} on {$e->getLine()}";
}
在PDO中,您可以使用命名的占位符:name
而不是?
就像MySqli使用的一样(您仍可以在PDO中使用?
)。 我通常要做的是复制字段名称,并在它们前面添加:
。 命名占位符使跟踪值在哪里变得容易,并且数据数组的顺序(在execute
中使用甚至无关紧要)。 如您所见, mysqli
版本大约调用了4次,而PDO版本仅调用了2次,并且通过方法链接$Pdo->prepare($sql)->execute(...)
您甚至不需要将其放到换一行或设置一个局部变量。 这等效于:
//$Pdo->prepare($sql)->execute(...)
$stmt = $Pdo->prepare($sql); //returns PDOStatement
$stmt->execute(...); //makes a call on PDOStatement
因为$Pdo->prepare($sql)
如果不需要其他任何对象,则返回PDOStatement
,因此我们可以在链中上一个方法的返回值上调用->execute(...)
。 我觉得我应该解释一下,因为您可能不习惯使用对象。 但是,链接使代码保持整洁(没有多余的变量),这使跟踪事物(跟踪的事物更少)更加容易。
简而言之,在MySqli和PDO中都非常容易做到这一点,但是PDO具有很多优点,因此值得学习如何使用。 更好的接口,更好的获取方法,命名占位符,异常等...
干杯!
$sql = 'INSERT INTO family(
family_declaracao_renda,
familia_renda_mensal,
family_assinatura_local,
family_assinatura_dia,
family_assinatura_mes,
family_assinatura_ano,
family_deficiente_presente,
family_adaptacao_necessaria_imovel
)VALUES(
:family_declaracao_renda,
:familia_renda_mensal,
:family_assinatura_local,
:family_assinatura_dia,
:family_assinatura_mes,
:family_assinatura_ano,
:family_deficiente_presente,
:family_adaptacao_necessaria_imovel
)';
try{
$stmt = mysqli_stmt_init($link);
$Pdo->prepare($sql)->execute([
':family_declaracao_renda' => $family->getDeclaracaoRendaFamiliar(),
':familia_renda_mensal' => $family->getRendaBrutaMensal(),
':family_assinatura_local' => $family->getAssinaturaLocal(),
':family_assinatura_dia' => $family->getAssinaturaDia(),
':family_assinatura_mes' => $family->getAssinaturaMes(),
':family_assinatura_ano' => $family->getAssinaturaAno(),
':family_deficiente_presente' => $family->getDeficientePresente(),
':family_adaptacao_necessaria_imovel'=> $family->getAdaptacaoImovelNecessaria(),
]);
}catch(PDOException $e){
echo "PDOException[{$e->getCode()}] {$e->getMessage()} in {$e->getFile()} on {$e->getLine()}";
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.