标签: prepared-statement

如何在不同的环境中获取MySQLi错误信息

在我的本地/开发环境中,MySQLi查询执行正常.但是,当我在我的Web主机环境中上传它时,我收到此错误:

致命错误:在...中的非对象上调用成员函数bind_param()

这是代码:

global $mysqli;
$stmt = $mysqli->prepare("SELECT id, description FROM tbl_page_answer_category WHERE cur_own_id = ?");
$stmt->bind_param('i', $cur_id);
$stmt->execute();
$stmt->bind_result($uid, $desc);
Run Code Online (Sandbox Code Playgroud)

为了检查我的查询,我试图通过控制面板phpMyAdmin执行查询,结果是OK.

php environment mysqli error-reporting prepared-statement

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

带有IN子句中参数列表的PreparedStatement

如何在执行查询时在JDBC中的preparedStatement中设置in子句的值.

例:

connection.prepareStatement("Select * from test where field in (?)");
Run Code Online (Sandbox Code Playgroud)

如果此子句可以包含多个值,我该怎么做.有时我事先知道参数列表,有时我事先不知道.如何处理这种情况?

java jdbc prepared-statement in-clause

84
推荐指数
6
解决办法
23万
查看次数

Java:使用PreparedStatement在MySQL中插入多行

我想使用Java一次将多行插入MySQL表.行数是动态的.过去我在做......

for (String element : array) {
    myStatement.setString(1, element[0]);
    myStatement.setString(2, element[1]);

    myStatement.executeUpdate();
}
Run Code Online (Sandbox Code Playgroud)

我想优化它以使用MySQL支持的语法:

INSERT INTO table (col1, col2) VALUES ('val1', 'val2'), ('val1', 'val2')[, ...]
Run Code Online (Sandbox Code Playgroud)

但是PreparedStatement我不知道有什么方法可以做到这一点,因为我事先不知道array会包含多少元素.如果a不可能PreparedStatement,我还能怎么做(并且仍然逃避数组中的值)?

java mysql jdbc prepared-statement batch-insert

83
推荐指数
3
解决办法
14万
查看次数

PreparedStatement setNull(..)

Java PreparedStatement提供了明确设置Null值的可能性.这种可能性是:

prepStmt.setNull(parameterIndex, Types.VARCHAR);
Run Code Online (Sandbox Code Playgroud)

此调用的语义是否与使用具有null参数的特定setType时的语义相同?

prepStmt.setString(null);
Run Code Online (Sandbox Code Playgroud)

java jdbc prepared-statement

77
推荐指数
5
解决办法
12万
查看次数

如何使用bind_result与get_result的示例

我想看一个如何调用使用bind_resultvs 的示例,以及get_result使用one over另一个的目的是什么.

也是使用每个的利弊.

使用任何一个的限制是什么,是否存在差异.

php mysql mysqli prepared-statement

76
推荐指数
1
解决办法
8万
查看次数

哪里是我的无效角色(ORA-00911)

我正在尝试将CLOBs插入数据库(请参阅相关问题).我无法弄清楚出了什么问题.我有一个大约85个clobs的列表,我想插入表中.即使只插入我得到的第一个clob ORA-00911: invalid character.我无法弄清楚如何PreparedStatement在执行之前获取声明,因此我无法100%确定它是正确的,但如果我做对了,那么它看起来应该是这样的:

insert all
  into domo_queries values ('select 
substr(to_char(max_data),1,4) as year,
substr(to_char(max_data),5,6) as month,
max_data
from dss_fin_user.acq_dashboard_src_load_success
where source = ''CHQ PeopleSoft FS''')
select * from dual;
Run Code Online (Sandbox Code Playgroud)

最终,这个insert all陈述会有很多into,这就是我不做常规insert陈述的原因.我没有在那里看到无效的角色,对吗?(哦,当我在我的sql开发人员工具中运行它时,上面的代码运行正常.)如果我删除了分号PreparedStatement,它会抛出ORA-00933: SQL command not properly ended错误.

在任何情况下,这是我执行查询的代码(以及上面示例的变量值).

public ResultSet executeQuery(String connection, String query, QueryParameter... params) throws DataException, SQLException {
  // query at this point = "insert all
                          //into domo_queries …
Run Code Online (Sandbox Code Playgroud)

java oracle jdbc prepared-statement

65
推荐指数
2
解决办法
13万
查看次数

PHP - 将PDO与IN子句数组一起使用

我正在使用PDO执行一个带有IN子句的语句,该子句使用数组作为它的值:

$in_array = array(1, 2, 3);
$in_values = implode(',', $in_array);
$my_result = $wbdb->prepare("SELECT * FROM my_table WHERE my_value IN (".$in_values.")");
$my_result->execute();
$my_results = $my_result->fetchAll();
Run Code Online (Sandbox Code Playgroud)


上面的代码完全正常,但我的问题是为什么这不是:

 $in_array = array(1, 2, 3);
    $in_values = implode(',', $in_array);
    $my_result = $wbdb->prepare("SELECT * FROM my_table WHERE my_value IN (:in_values)");
    $my_result->execute(array(':in_values' => $in_values));
    $my_results = $my_result->fetchAll();
Run Code Online (Sandbox Code Playgroud)

此代码将返回my_value等于$in_array(1)中第一项的项,但不返回数组中的其余项(2和3).

php mysql pdo prepared-statement in-clause

60
推荐指数
3
解决办法
5万
查看次数

有没有办法从预准备语句中检索自动增量ID

有没有办法在使用带有预准备语句的java查询时从数据库查询中检索自动生成的密钥.

例如,我知道AutoGeneratedKeys可以如下工作.

stmt = conn.createStatement();

stmt.executeUpdate(sql, Statement.RETURN_GENERATED_KEYS);
if(returnLastInsertId) {
    ResultSet rs = stmt.getGeneratedKeys();
    rs.next();
    auto_id = rs.getInt(1);
} 
Run Code Online (Sandbox Code Playgroud)

然而.如果我想使用准备好的Statement进行插入,该怎么办?

String sql = "INSERT INTO table (column1, column2) values(?, ?)";
stmt = conn.prepareStatement(sql);

//this is an error
stmt.executeUpdate(Statement.RETURN_GENERATED_KEYS);
if(returnLastInsertId) {
    //this is an error since the above is an error
    ResultSet rs = stmt.getGeneratedKeys();
    rs.next();
    auto_id = rs.getInt(1);
} 
Run Code Online (Sandbox Code Playgroud)

有没有办法做到这一点,我不知道.从javadoc看来,PreparedStatements无法返回自动生成的ID.

java mysql prepared-statement auto-increment

59
推荐指数
1
解决办法
9万
查看次数

MySQLi编写了语句错误报告

我正试图绕过MySQli,我对错误报告感到困惑.我使用MySQLi'prepare'语句的返回值来检测执行SQL时的错误,如下所示:

$stmt_test =  $mysqliDatabaseConnection->stmt_init();
if($stmt_test->prepare("INSERT INTO testtable VALUES (23,44,56)"))
{
 $stmt_test->execute();
 $stmt_test->close();
}
else echo("Statement failed: ". $stmt_test->error . "<br>");
Run Code Online (Sandbox Code Playgroud)

但是,prepare语句的返回值是仅检测SQL语句的预处理中是否存在错误而未检测到执行错误?如果是这样,我应该更改我的执行行以标记错误,如下所示:

if($stmt_test->execute()) $errorflag=true;
Run Code Online (Sandbox Code Playgroud)

然后只是为了安全我应该在语句执行后执行以下操作:

if($stmt_test->errno) {$errorflag=true;}
Run Code Online (Sandbox Code Playgroud)

...或者我可以开始使用MySQLi prepare'语句的返回值捕获与它定义的查询的完整执行相关的所有错误?

谢谢C.

php mysql mysqli prepared-statement

58
推荐指数
3
解决办法
9万
查看次数

准备好的声明和表现

所以我一直听说PreparedStatements对性能有好处.

我们有一个Java应用程序,我们使用常规的'Statement'比使用'PreparedStatement'更多.在尝试使用更多PreparedStatements时,我试图更全面地了解PreparedStatements如何工作 - 在客户端和服务器端.

因此,如果我们有一些典型的CRUD操作并在应用程序中重复更新对象,它是否有助于使用PS?我知道每次都要关闭PS,否则会导致光标泄漏.

那么它对性能有何帮助?驱动程序是否缓存预编译语句,并在下次进行connection.prepareStatement时给我一份副本?或者DB服务器有帮助吗?

我理解关于PreparedStatements的安全性好处的论点,我理解下面强调它的答案.但是,我真的希望将讨论重点放在PreparedStatements的性能优势上.

更新:当我说更新数据时,我真的意味着更多的方法随机被多次调用.我理解下面提供的答案中的优点,它要求在循环中重用语句.

    // some code blah blah
    update();

    // some more code blah blah 
    update();

.... 

public void update () throws SQLException{
 try{
      PreparedStatement ps = connection.prepareStatement("some sql");
      ps.setString(1, "foobar1");
      ps.setString(2, "foobar2");
      ps.execute();
 }finally {
     ps.close();

 }

}
Run Code Online (Sandbox Code Playgroud)

没有办法实际重用'ps'java对象,我理解实际的connection.prepareStatement调用非常昂贵.

这让我回到原来的问题.这个"一些sql"PreparedStatement仍然被缓存并重新使用在我不知道的封面下吗?

我还要提一下,我们支持几个数据库.

提前致谢.

java database performance prepared-statement

53
推荐指数
4
解决办法
3万
查看次数