在我的本地/开发环境中,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.
如何在执行查询时在JDBC中的preparedStatement中设置in子句的值.
例:
connection.prepareStatement("Select * from test where field in (?)");
Run Code Online (Sandbox Code Playgroud)
如果此子句可以包含多个值,我该怎么做.有时我事先知道参数列表,有时我事先不知道.如何处理这种情况?
我想使用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 PreparedStatement提供了明确设置Null值的可能性.这种可能性是:
prepStmt.setNull(parameterIndex, Types.VARCHAR);
Run Code Online (Sandbox Code Playgroud)
此调用的语义是否与使用具有null参数的特定setType时的语义相同?
prepStmt.setString(null);
Run Code Online (Sandbox Code Playgroud)
?
我想看一个如何调用使用bind_resultvs 的示例,以及get_result使用one over另一个的目的是什么.
也是使用每个的利弊.
使用任何一个的限制是什么,是否存在差异.
我正在尝试将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) 我正在使用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).
有没有办法在使用带有预准备语句的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.
我正试图绕过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.
所以我一直听说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 ×6
mysql ×5
jdbc ×4
php ×4
mysqli ×3
in-clause ×2
batch-insert ×1
database ×1
environment ×1
oracle ×1
pdo ×1
performance ×1