![](/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.