繁体   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