簡體   English   中英

PHP和MySql-如何使此插入查詢起作用?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM