相关疑难解决方法(0)

PHP PDO语句可以接受表名或列名作为参数吗?

为什么我不能将表名传递给准备好的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)

php pdo

232
推荐指数
5
解决办法
7万
查看次数

PHP/MYSQL - MySQLi准备语句 - 可以将bind_param用于ORDER BY吗?(订购结果集)

在我看来,我有一个类似这样的查询:

$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)

php mysqli sql-order-by prepared-statement bindparam

7
推荐指数
1
解决办法
3409
查看次数

mysqli 准备语句查询错误在哪里?

我正在尝试创建一个 mysqli 准备好的语句,我将表从 odbc 连接的数据库导入到 mysql 数据库中,我在 106 列宽的表查询中遇到此错误。

您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,了解在 '? (ID, column1, column2, column3, column4, '在第 1 行"

当我在此处回显查询时,它是...

插入 ?(ID, column1, column2, column3, column4, ...总共 106 列...) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ? , ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ? , ?, ?, ?, ?, ?, …

php mysql mysqli prepared-statement

5
推荐指数
1
解决办法
1169
查看次数

如何在 MySQL 中使用准备好的语句截断表?

这将返回 true 但它没有截断表:

$this->db->query("TRUNCATE TABLE $tablename");
Run Code Online (Sandbox Code Playgroud)

但它在为准备好的语句创建数据库连接对象之前工作。

如何解决?另外,我想知道如何使用准备好的语句截断表。

php mysql prepared-statement

5
推荐指数
1
解决办法
3498
查看次数

oracle异常:表名无效

JDBC用于连接Servlets中的数据库(Oracle10).
以下是我的查询,其中我想动态设置三个参数.

  1. 表名
  2. 列名

查询:

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 nameColumn Namesas,我该怎么办?mypstmt.setString(1,tableName)

EDIT1 我为什么要原因parameterizeTable name,并Column name是我允许用户选择/输入表名和列名,所以我想避免SQL Injection.

java oracle servlets jdbc

2
推荐指数
1
解决办法
5465
查看次数

Mysqli 准备语句列与变量

我的代码必须使用自定义变量作为列来更新查询。

如何安全地绑定列名?

$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)

php mysqli

2
推荐指数
1
解决办法
2059
查看次数

用变量替换表名.使用python和mysql连接器

我想动态更改我插入数据的表的变量名称.

这目前有效,

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)

python mysql mysql-connector

1
推荐指数
1
解决办法
4794
查看次数

PHP:调整SELECT for SQL注入预防后循环不起作用

我试图以防止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()

提前谢谢了.

php mysql select associative-array sql-injection

1
推荐指数
1
解决办法
141
查看次数