他们都做同样的事情,只是区别对待吗?
除了使用prepare之间有什么区别
$sth = $db->query("SELECT * FROM table");
$result = $sth->fetchAll();
Run Code Online (Sandbox Code Playgroud)
和
$sth = $db->prepare("SELECT * FROM table");
$sth->execute();
$result = $sth->fetchAll();
Run Code Online (Sandbox Code Playgroud)
?
我已多次使用mysqli_stmt_bind_param函数.但是,如果我将我试图防止SQL注入的变量分开,我会遇到错误.
这是一些代码示例:
function insertRow( $db, $mysqli, $new_table, $Partner, $Merchant, $ips, $score, $category, $overall, $protocol )
{
$statement = $mysqli->prepare("INSERT INTO " .$new_table . " VALUES (?,?,?,?,?,?,?);");
mysqli_stmt_bind_param( $statment, 'sssisss', $Partner, $Merchant, $ips, $score, $category, $overall, $protocol );
$statement->execute();
}
Run Code Online (Sandbox Code Playgroud)
是否有可能以某种方式.$new_table.用另一个问号语句替换连接,创建另一个绑定参数语句,或添加到现有的语句以防止SQL注入?
像这样或某种形式:
function insertRow( $db, $mysqli, $new_table, $Partner, $Merchant, $ips, $score, $category, $overall, $protocol )
{
$statement = $mysqli->prepare("INSERT INTO (?) VALUES (?,?,?,?,?,?,?);");
mysqli_stmt_bind_param( $statment, 'ssssisss', $new_table, $Partner, $Merchant, $ips, $score, $category, $overall, $protocol );
$statement->execute();
}
Run Code Online (Sandbox Code Playgroud) 我使用修改我的代码mysql_*来PDO.在我的代码中我有mysql_real_escape_string().在PDO中,这相当于什么?
我在ORDER BYSQL 的部分使用params时遇到问题.它不会发出任何警告,但不打印任何内容.
$order = 'columnName';
$direction = 'ASC';
$stmt = $db->prepare("SELECT field from table WHERE column = :my_param ORDER BY :order :direction");
$stmt->bindParam(':my_param', $is_live, PDO::PARAM_STR);
$stmt->bindParam(':order', $order, PDO::PARAM_STR);
$stmt->bindParam(':direction', $direction, PDO::PARAM_STR);
$stmt->execute();
Run Code Online (Sandbox Code Playgroud)
该:my_param作品,但没有:order或:direction.是不是在内部正确转义?我是不是直接插入SQL?像这样:
$order = 'columnName';
$direction = 'ASC';
$stmt = $db->prepare("SELECT * from table WHERE column = :my_param ORDER BY $order $direction");
Run Code Online (Sandbox Code Playgroud)
是PDO::PARAM_COLUMN_NAME常数还是等价?
谢谢!
// BUILD VALUES
$count = count($matches);
for($i = 0; $i < $count; ++$i) {
$values[] = '(?)';
}
// INSERT INTO DATABASE
$q = $this -> dbc -> prepare("INSERT INTO hashes (hash) VALUES " . implode(', ', $values) . " ON DUPLICATE KEY UPDATE hash = hash");
$q -> execute($matches);
Run Code Online (Sandbox Code Playgroud)
上面的代码失败,出现以下错误
SQLSTATE [HY093]:参数号无效:未定义参数
虽然count($matches) == count($values)在执行之前就被调用了?
这里发生了什么?
从本质上讲,我有一个值,我必须在我的SQL查询中调用几次.因此,是否可以在语句中重用相同的命名占位符,例如
SELECT :Param FROM Table WHERE Column = :Param,然后简单地使用bindValue(":Param"),并且两者都有值:Params?
是否可以绑定表名?
我想创建一个类来读取表中的列,并根据字段类型为我生成表单输入.当我这样做时$form = new form("users");,构造函数应该从使用以下代码从表中获取字段名称开始:
class form{
public function __construct($table, $skip = array("id")){
$pdo = new PDO('mysql:host=localhost;dbname=site;',USER,PASS);
$query = $pdo->prepare("DESCRIBE :table");
$query->bindValue(':table', $table, PDO::PARAM_STR, strlen($table));
$query->execute();
while($field = $query->fetch(PDO::FETCH_NUM)){
var_dump($field);
echo "<br /><br />";
}
unset($pdo);
}
}
Run Code Online (Sandbox Code Playgroud)
当我在prepare语句中指定"users"而不是":table"时,这很好用,但绑定它正在工作,我很确定这是因为它试图绑定一个表名.此外,这需要绑定,因为我希望能够通过我的表名传递$_GET等等.
我正在玩PHP/PDO中的预处理语句.基本查询工作正常,将值传递给WHERE子句:
$stmt = $db->prepare( 'SELECT title FROM episode WHERE id=:id' );
$stmt->bindParam( ':id', $id, PDO::PARAM_INT );
$id = 5;
$stmt->execute();
Run Code Online (Sandbox Code Playgroud)
但是我有一种情况需要为字段名称传递变量.此查询(具有适当的绑定)工作正常:
SELECT :field FROM episode WHERE id=:id
Run Code Online (Sandbox Code Playgroud)
这个给出了一个错误:
SELECT title FROM :field WHERE id=:id
Run Code Online (Sandbox Code Playgroud)
这个没有给出错误,但没有返回任何行:
SELECT title FROM episode WHERE :field=:id
Run Code Online (Sandbox Code Playgroud)
那么,准备好的陈述中哪些东西应该有效?我可以'参数化'字段名称,表名等吗?
注意:以下示例中的唯一区别是ORDER BY子句.
好代码:
$sql = 'SELECT [date], ? AS [name]
FROM [transactions]
WHERE [category_id] = 10
GROUP BY [date]
ORDER BY [date] ASC';
$stmt = $db->prepare($sql);
$stmt->bindValue(1, 'Test', PDO::PARAM_STR);
$stmt->execute();
$data = $stmt->fetchAll();
//returns rows in $data
Run Code Online (Sandbox Code Playgroud)
不好的代码:
$sql = 'SELECT [date], ? AS [name]
FROM [transactions]
WHERE [category_id] = 10
GROUP BY [date]
ORDER BY [date] ASC, [name] ASC';
$stmt = $db->prepare($sql);
$stmt->bindValue(1, 'Test', PDO::PARAM_STR);
$stmt->execute();
$data = $stmt->fetchAll();
//returns an empty array
Run Code Online (Sandbox Code Playgroud)
为什么我的第二段代码不起作用?如果我直接运行此查询的任一版本(在SQL Management Studio中),它可以以任何方式工作.如果我摆脱PHP中的问号并将值硬编码到查询中(而不是绑定它),那也是有效的!这里发生了什么? …
我有一个应用程序,它为我的PHP传递一个变量(nomecardapioBD,它接收并记录在变量:nomecardapioBD),这是我想要选择所有行和列的表名.
但通过邮局收到变量无法进行预约.谁能告诉我这部分代码有什么问题?
$query = "Select * FROM :nomecardapioBD ";
$query_params = array(
':nomecardapioBD' => $_POST['nomecardapioBD']
);
//execute query
try {
$stmt = $db->prepare($query);
$result = $stmt->execute($query_params);
}
catch (PDOException $ex) {
$response["success"] = 0;
$response["message"] = "Database Error!";
die(json_encode($response));
}
// Finally, we can retrieve all of the found rows into an array using fetchAll
$rows = $stmt->fetchAll();
Run Code Online (Sandbox Code Playgroud)