为什么我不能将表名传递给准备好的PDO语句?
$stmt = $dbh->prepare('SELECT * FROM :table WHERE 1');
if ($stmt->execute(array(':table' => 'users'))) {
var_dump($stmt->fetchAll());
}
Run Code Online (Sandbox Code Playgroud)
是否有另一种安全的方法将表名插入SQL查询?安全我的意思是我不想这样做
$sql = "SELECT * FROM $table WHERE 1"
Run Code Online (Sandbox Code Playgroud) 在我看来,我有一个类似这样的查询:
$sort = isset($sort) ? sanitize($_sort) : 'id';
if ($result = $link->prepare("
SELECT id, price
FROM items
ORDER BY ?
"))
{
$result->bind_param("s", $sort);
$result->execute();
etc...
}
Run Code Online (Sandbox Code Playgroud)
当我运行此代码块而不设置排序变量时,它运行没有与使用?相关的错误?在ORDER BY子句中,结果集显示在带有"ORDER BY id"的结果集中.
这是一个问题:
现在,如果我将sort变量设置为"price ASC"之类的东西,我仍然会得到一个似乎是"ORDER BY id"而不是"ORDER BY price ASC"的结果集.
当我在phpmyadmin中作为查询运行查询时,如果我以这种方式定义查询,它将根据"价格ASC"返回正确的结果集.
现在,如果我改变代码并像这样运行它:
$sort = isset($sort) ? sanitize($_sort) : 'id';
if ($result = $link->prepare("
SELECT id, price
FROM items
ORDER BY $sort
"))
{
$result->execute();
etc...
}
Run Code Online (Sandbox Code Playgroud)
它运行正常,结果集与我在phpmyadmin中的查询相同...
有人可以告诉我这里究竟发生了什么,以及为什么查询不能像我最初使用bind_param那样运行.
在我看来,它应该工作,因为没有出现与此类使用相关的错误......但在实践中,它似乎不适用于ORDER BY子句.它几乎就像在运行bind_param时没有翻译sort变量一样.
感谢您阅读我的问题,任何有关它的输入将不胜感激!
编辑:
对任何感兴趣的人
if (isset($sort))
{
$acceptableSortValues = array('name', 'price ASC', …Run Code Online (Sandbox Code Playgroud) 我正在尝试创建一个 mysqli 准备好的语句,我将表从 odbc 连接的数据库导入到 mysql 数据库中,我在 106 列宽的表查询中遇到此错误。
您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,了解在 '? (ID, column1, column2, column3, column4, '在第 1 行"
当我在此处回显查询时,它是...
插入 ?(ID, column1, column2, column3, column4, ...总共 106 列...) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ? , ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ? , ?, ?, ?, ?, ?, …
这将返回 true 但它没有截断表:
$this->db->query("TRUNCATE TABLE $tablename");
Run Code Online (Sandbox Code Playgroud)
但它在为准备好的语句创建数据库连接对象之前工作。
如何解决?另外,我想知道如何使用准备好的语句截断表。
我JDBC用于连接Servlets中的数据库(Oracle10).
以下是我的查询,其中我想动态设置三个参数.
查询:
query = "select ? from ? where ? = ?";
mypstmt = con.prepareStatement(query);
mypstmt.setString(1, tableName);
mypstmt.setString(2, columnName);
mypstmt.setString(3, columnName2);
mypstmt.setString(4, value);
Run Code Online (Sandbox Code Playgroud)
但上面的查询给了我错误:
java.sql.SQLException: ORA-00903: invalid table name
Run Code Online (Sandbox Code Playgroud)
我检查了表名.它是正确的,如果我写的查询如下:
query = "select "+columnName+" from "+tableName+" where "+columnName2+" = ?";
Run Code Online (Sandbox Code Playgroud)
然后它正在执行罚款.
那么如果我想设置Table name和Column Namesas,我该怎么办?mypstmt.setString(1,tableName)
EDIT1
我为什么要原因parameterize的Table name,并Column name是我允许用户选择/输入表名和列名,所以我想避免SQL Injection.
我的代码必须使用自定义变量作为列来更新查询。
如何安全地绑定列名?
$username = 'MyUsername';
$rank = 'Administrator';
$server = 'Node5';
$stmt = $connection->prepare("UPDATE staff_members SET ?=? WHERE Username=? LIMIT 1");
$stmt->bind_param("sss", $server, $rank, $username);
$stmt->execute();
Run Code Online (Sandbox Code Playgroud) 我想动态更改我插入数据的表的变量名称.
这目前有效,
def dataEntry(subreddit, _title, _post_url, _imageURL):
cnx = mysql.connector.connect(**config)
c = cnx.cursor()
insert = ("""INSERT INTO FoodPorn
(subreddit, title, post_url, imageURL)
VALUES (%s, %s, %s, %s)""")
data_value = (subreddit, _title, _post_url, _imageURL)
c.execute(insert, data_value)
cnx.commit()
c.close()
cnx.close()
dataEntry("fake", "fake", "fake", "fake")
Run Code Online (Sandbox Code Playgroud)
但是当我尝试为这个案例中的表名"FoodPorn"做同样的事情时,但对于动态的一个,例如在这个例子中的MachinePorn,
def dataEntry(subreddit, _title, _post_url, _imageURL):
cnx = mysql.connector.connect(**config)
c = cnx.cursor()
insert = ("""INSERT INTO subredditName
(subreddit, title, post_url, imageURL)
VALUES (%s, %s, %s, %s, %s)""")
data_value = ("MachinePorn", subreddit, _title, _post_url, _imageURL)
c.execute(insert, data_value)
cnx.commit()
c.close() …Run Code Online (Sandbox Code Playgroud) 我试图以防止SQL注入(标准网站)的方式为MySQL设置PHP查询.
我有几个INSERT查询,其中更改此工作正常,但在以下SELECT我不断收到错误,因为更新,它看起来像while循环不适用于我所做的更改(它运行良好,不使用语句作为在旧代码中).
谁能告诉我这里做错了什么?
新PHP:
$stmt = $conn->prepare("SELECT ? FROM TranslationsMain WHERE location LIKE '%calendar weekday%' ORDER BY sortOrder, ?");
$stmt->bind_param('s', $selectedLang);
$stmt->execute();
$result = $stmt->get_result();
while($arrCalWeekdays = $result->fetch_assoc()){
$calWeekdays[] = $arrCalWeekdays;
}
$conn->close();
Run Code Online (Sandbox Code Playgroud)
旧PHP(更改部分):
$sql = "SELECT " . $selectedLang . " FROM TranslationsMain WHERE location LIKE '%calendar weekday%' ORDER BY sortOrder, " . $selectedLang;
$result = $conn->query($sql);
while($arrCalWeekdays = $result->fetch_assoc()){
$calWeekdays[] = $arrCalWeekdays;
}
$conn->close();
Run Code Online (Sandbox Code Playgroud)
错误信息:
致命错误:在第21行的/homepages/21/d580042014/htdocs/myform.php中调用非对象上的成员函数fetch_assoc()
提前谢谢了.