我被建议使用反sql注入方法,因为我在数据库中插入值。我环顾网络,我第一次失败的尝试是这个,我需要一些帮助,使用PDO方法。我发现网上的例子太过于实质,我无法理解(顺便说一句,我跑了一条线,它告诉我PDO已启用):
这在任何方面,形状或形式都是好的吗?
<?php
include ('config.php');
// Host, User, Pass, DB
$con=mysqli_connect("127.0.0.1","*****","*****","*****");
// Check connection
if (mysqli_connect_errno())
{
echo "Failed to connect to MySQLi: " . mysqli_connect_error();
}
$host = 'localhost';
$dbname = '****';
$user = '****';
$pass = '*****';
try {
# MS SQL Server and Sybase with PDO_DBLIB
$DBH = new PDO("mssql:host=$host;dbname=$dbname, $user, $pass");
$DBH = new PDO("sybase:host=$host;dbname=$dbname, $user, $pass");
# MySQL with PDO_MYSQL
$DBH = new PDO("mysql:host=$host;dbname=$dbname", $user, $pass);
# SQLite Database
$DBH = new PDO("sqlite:my/database/path/database.db");
}
catch(PDOException $e) {
echo $e->getMessage();
}
另外,我在提交表单时收到此错误:
Fatal error: Call to a member function prepare() on a non-object in /home/product/*****/*****/*****/processForm-test.php on line 68
答案 0 :(得分:2)
您的代码中的一个大问题是它使用mysqli_connect
和PDO
来创建数据库连接。不要那样做;那是不受支持的。使用其中一种。
您拥有PDO连接的行尝试连接到四个独立的数据库,SQL Server,Sybase,MySQL和SQLLite,所有这些都在localhost上运行。但是你只保留最后一个句柄,因为你将数据库连接分配给同一个变量。
如果连接成功,那么变量$DBH
是您对数据库会话(连接)的引用。如果不成功,则会在继续之前为其分配值false
,您可以对其进行测试。
我认为您需要的只是与MySQL的单个PDO连接,如下所示:
<?php
include ('config.php');
$host = 'localhost';
$dbname = '****';
$user = '****';
$pass = '*****';
try {
# MySQL with PDO_MYSQL
$DBH = new PDO("mysql:host=$host;dbname=$dbname", $user, $pass);
}
catch(PDOException $e) {
echo "Connect failed: " . $e->getMessage();
}
我在这里推断,但是你得到的错误消息最可能的解释是你有一行代码(代码示例中没有显示),如下所示:
$sth = $DBH->prepare($sql);
问题是$DBH
不是对有效数据库连接的引用。 $DBH
的值为“false”,这是因为尝试连接数据库失败。并且false
不是一个对象,因此它无法与名称为'prepare'的方法相关联。