GVKun编程网logo

通过准备好的语句使用INSERT INTO进行PDO(通过准备问题)

9

对于通过准备好的语句使用INSERTINTO进行PDO感兴趣的读者,本文将提供您所需要的所有信息,我们将详细讲解通过准备问题,并且为您提供关于DoctrineRawSQL和准备好的语句、PDO准备好的

对于通过准备好的语句使用INSERT INTO进行PDO感兴趣的读者,本文将提供您所需要的所有信息,我们将详细讲解通过准备问题,并且为您提供关于Doctrine Raw SQL和准备好的语句、PDO 准备好的语句是否足以防止 SQL 注入?、PDO 准备好的语句:获取 NULL 而不是预期的结果、PDO准备好的语句-参数名称中的冒号用于什么?的宝贵知识。

本文目录一览:

通过准备好的语句使用INSERT INTO进行PDO(通过准备问题)

通过准备好的语句使用INSERT INTO进行PDO(通过准备问题)

在穿越PHP:数据对象的丛林中,我遇到了通过准备好的语句执行MySQL查询的问题。

观察以下代码:

$dbhost = "localhost";$dbname = "pdo";$dbusername = "root";$dbpassword = "845625";$link = new PDO("mysql:host=$dbhost;dbname=$dbname","$dbusername","$dbpassword");$statement = $link->prepare("INSERT INTO testtable(name, lastname, age)        VALUES(''Bob'',''Desaunois'',''18'')");    $statement->execute();

这就是我,我想进入我的数据库。但是我一直迷路在..好吧..我不知道!根据谷歌,这是做到这一点的方法,尽管我的数据库仍然是空的。

我在这里想念什么吗?因为我已经被困了一个小时,所以我想继续学习PDO!

答案1

小编典典

你应该像这样使用它

<?php$dbhost = ''localhost'';$dbname = ''pdo'';$dbusername = ''root'';$dbpassword = ''845625'';$link = new PDO("mysql:host=$dbhost;dbname=$dbname", $dbusername, $dbpassword);$statement = $link->prepare(''INSERT INTO testtable (name, lastname, age)    VALUES (:fname, :sname, :age)'');$statement->execute([    ''fname'' => ''Bob'',    ''sname'' => ''Desaunois'',    ''age'' => ''18'',]);

准备的语句用于清理您的输入,并且您可以在SQL中使用这些语句:foo 而无需 任何单引号来 绑定
变量,然后在execute()函数中传递在SQL语句中定义的变量的关联数组。

您也可以使用?代替,:foo然后像这样传递仅输入值的数组;

$statement = $link->prepare(''INSERT INTO testtable (name, lastname, age)    VALUES (?, ?, ?)'');$statement->execute([''Bob'', ''Desaunois'', ''18'']);

两种方式都有其优点和缺点。我个人更喜欢绑定参数名称,因为它更易于阅读。

Doctrine Raw SQL和准备好的语句

Doctrine Raw SQL和准备好的语句

我有一个使用准备好的语句的Doctrine_RawSql查询。但是,当生成SQL查询时,它们似乎会被忽略。但是,如果我忽略了标记值,则会得到关于不匹配的绑定变量数量的异常(因此,至少是试图将它们包含在内)。

如果我内联包含这些值,Doctrine是否在幕后做任何事情以防止SQL注入?

这是我的代码:

public function sortedPhotogsByLocation($location)
{
    $q = new Doctrine_RawSql();
    $result = $q->select('{p.*}')
            ->from('photographers p')
            ->addComponent('p','Photographer')
            ->where('p.city_id = ?',$location->id)
            ->orderBy('CASE WHEN p.lname < "?%" THEN 1 ELSE 0 END,p.lname ASC',$location->photographer_sort)
            ->execute();
    return $result;
}

这提供了以下SQL输出:

  SELECT *  
  FROM photographers p 
  WHERE p.city_id = ? 
  ORDER BY 
    CASE WHEN p.lname < "?%" THEN 1 ELSE 0 END,p.lname 
  ASC

编辑:上的属性$location已正确设置。如果我对参数进行硬编码:

->where('p.city_id = ?',5)

我遇到了相同的问题,即令牌没有被替换。

PDO 准备好的语句是否足以防止 SQL 注入?

PDO 准备好的语句是否足以防止 SQL 注入?

假设我有这样的代码:

$dbh = new PDO("blahblah");

$stmt = $dbh->prepare('SELECT * FROM users where username = :username');
$stmt->execute( array(':username' => $_REQUEST['username']) );

PDO 文档说:

准备好的语句的参数不需要引用;司机为您处理。

这真的是我需要做的一切来避免 SQL 注入吗? 真的那么容易吗?

如果它有所作为,您可以假设 MySQL。另外,我真的只是对使用准备好的语句来对抗 SQL 注入感到好奇。在这种情况下,我不关心 XSS 或其他可能的漏洞。

PDO 准备好的语句:获取 NULL 而不是预期的结果

PDO 准备好的语句:获取 NULL 而不是预期的结果

您似乎发现了 MariaDB SQL 优化器的错误。请尽早向他们提交错误报告。

该问题与 PDO 无关。您看到不同结果的原因是 PDO 默认将所有值绑定为字符串。当您将其绑定为字符串时,会正确评估 WHERE 子句中的比较。当您将值转换为整数或使用文字 1 时,优化器会将其与 product.id 进行比较,而不是与 stock.product 进行比较。不太确定这里内部发生​​了什么,但显然使用整数时行为是错误的。您可以在 https://dba.stackexchange.com/ 上询问是否有人对此行为有解释,但这很可能需要由 MariaDB 团队作为错误解决。

Here is an online reproducible version of this bug.

PDO准备好的语句-参数名称中的冒号用于什么?

PDO准备好的语句-参数名称中的冒号用于什么?

:使用PDO时,我已经看到很多文章在命名参数前使用冒号(),还有一些不使用冒号的文章。我会尽快不使用冒号,只是因为它的按键少了一点,而且读起来也更容易一点。

这似乎对我来说很好,但是我很好奇在使用冒号时是否缺少一些重要的东西?

例如,这很好用:

function insertRecord ($conn, $column1, $comumn2) {    try {        $insertRecord = $conn->prepare(''INSERT INTO Table1 (column1, column2)        VALUES(:column1, :column2)'');        $insertRecord->execute(array(                ''column1'' => $column1,                ''column2'' => $column2            ));    }    catch(PDOException $e) {        echo $e->getMessage();    }}

与大多数使用此功能的开发人员相对,这也可以:

function insertRecord ($conn, $column1, $comumn2) {    try {        $insertRecord = $conn->prepare(''INSERT INTO Table1 (column1, column2)        VALUES(:column1, :column2)'');        $insertRecord->execute(array(                '':column1'' => $column1,                '':column2'' => $column2            ));    }    catch(PDOException $e) {        echo $e->getMessage();    }}

注意execute语句参数中的冒号。

我想了解冒号的用途。

答案1

小编典典

SQL语句中必须使用冒号,以指示哪些标识符是占位符。

execute()bindParam()调用中的冒号是可选的。文档中对它们进行了说明,但是实现足够聪明,可以弄清楚如果不考虑它们的意思(您还有什么意思?)。

关于通过准备好的语句使用INSERT INTO进行PDO通过准备问题的介绍现已完结,谢谢您的耐心阅读,如果想了解更多关于Doctrine Raw SQL和准备好的语句、PDO 准备好的语句是否足以防止 SQL 注入?、PDO 准备好的语句:获取 NULL 而不是预期的结果、PDO准备好的语句-参数名称中的冒号用于什么?的相关知识,请在本站寻找。

本文标签: