对于通过准备好的语句使用INSERTINTO进行PDO感兴趣的读者,本文将提供您所需要的所有信息,我们将详细讲解通过准备问题,并且为您提供关于DoctrineRawSQL和准备好的语句、PDO准备好的
对于通过准备好的语句使用INSERT INTO进行PDO感兴趣的读者,本文将提供您所需要的所有信息,我们将详细讲解通过准备问题,并且为您提供关于Doctrine Raw SQL和准备好的语句、PDO 准备好的语句是否足以防止 SQL 注入?、PDO 准备好的语句:获取 NULL 而不是预期的结果、PDO准备好的语句-参数名称中的冒号用于什么?的宝贵知识。
本文目录一览:- 通过准备好的语句使用INSERT INTO进行PDO(通过准备问题)
- Doctrine Raw SQL和准备好的语句
- PDO 准备好的语句是否足以防止 SQL 注入?
- PDO 准备好的语句:获取 NULL 而不是预期的结果
- 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_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 注入?
假设我有这样的代码:
$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 而不是预期的结果
您似乎发现了 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时,我已经看到很多文章在命名参数前使用冒号(),还有一些不使用冒号的文章。我会尽快不使用冒号,只是因为它的按键少了一点,而且读起来也更容易一点。
这似乎对我来说很好,但是我很好奇在使用冒号时是否缺少一些重要的东西?
例如,这很好用:
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准备好的语句-参数名称中的冒号用于什么?的相关知识,请在本站寻找。
本文标签: