我:在使用PDO时看到过许多在命名参数前使用冒号()的文章,以及一些不使用冒号的文章.我很快就不会使用冒号,只是因为它只是一次按键,而且更容易阅读.
它似乎对我来说很好,但我很好奇是否有一些重要的东西,我在冒号的使用时缺少?
例如,这很好用:
function insertRecord ($conn, $column1, $comumn2) {
try {
$insertRecord = $conn->prepare('INSERT INTO Table1 (column1, column2)
VALUES(:column1, :column2)');
$insertRecord->execute(array(
'column1' => $column1,
'column2' => $column2
));
}
catch(PDOException $e) {
echo $e->getMessage();
}
}
Run Code Online (Sandbox Code Playgroud)
与使用此功能的大多数开发人员相反,这也有效:
function insertRecord ($conn, $column1, $comumn2) {
try {
$insertRecord = $conn->prepare('INSERT INTO Table1 (column1, column2)
VALUES(:column1, :column2)');
$insertRecord->execute(array(
':column1' => $column1,
':column2' => $column2
));
}
catch(PDOException $e) {
echo $e->getMessage();
}
}
Run Code Online (Sandbox Code Playgroud)
注意execute语句参数中的冒号.
我想了解冒号的用途.
我有一个PreparedStatement,例如:
PreparedStatement preparedStatement = connect.prepareStatement("INSERT into employee (id, time, name" + "(?,?,?)",Statement.RETURN_GENERATED_KEYS);
ResultSet tableKeys = preparedStatement.getGeneratedKeys();
preparedStatement.executeUpdate();
tableKeys.next();
int autoGeneratedID = tableKeys.getInt(1);
preparedStatement.setInt(1,autoGeneratedID);
preparedStatement.setTimestamp(2, new java.sql.Timestamp(new java.util.Date().getTime()));
preparedStatement.setString(3, "Test");
preparedStatement.executeUpdate();
Run Code Online (Sandbox Code Playgroud)
如您所见,Employee表具有自动递增的ID.我需要基本上使用preparedStatement自动添加它.谁能告诉我哪里出错了并纠正我?现在它只是给我一个与Statement相关的错误.
我想使用一个准备好的语句,其中传入的参数用于ORDER BY和LIMIT子句,如下所示:
$sql = 'SELECT * FROM table ORDER BY :sort :dir LIMIT :start, :results';
$stmt = $dbh->prepare($sql);
$stmt->execute(array(
'sort' => $_GET['sort'],
'dir' => $_GET['dir'],
'start' => $_GET['start'],
'results' => $_GET['results'],
)
);
Run Code Online (Sandbox Code Playgroud)
但$stmt->fetchAll(PDO::FETCH_ASSOC);什么都不回报.
有人能指出我在做什么是错的吗?可以吗?如果没有,我应该参考哪些条款的完整列表可以使用参数?
如何让Hibernate记录它与预准备语句绑定的值?
如果我设置属性,hibernate.show_sql=true我会得到以下类型的日志:
insert into tablename (field1, field2) values (?, ?)
Run Code Online (Sandbox Code Playgroud)
我还想知道哪些值与问号有关.
我正在使用Hibernate 3.2.7.ga.
据我所知,有一种方法可以使用mysqli将数据输入到mysql数据库中,您不必使用mysql_real_escape_string.我的意思是这样的:
$stmt = $mysqli->prepare("INSERT INTO CountryLanguage VALUES (?, ?, ?, ?)");
$stmt->bind_param('sssd', "something", "something2", "something3", "123");
Run Code Online (Sandbox Code Playgroud)
现在我的问题:你能用UPDATE而不是INSERT做同样的事吗?表达式会是什么样的?它看起来如下:
$stmt = $mysqli->prepare("UPDATE CountryLanguage SET some = ?, some2 = ?, some3 = ?, some4 = ?");
$stmt->bind_param('sssd', "something", "something2", "something3", "123");`
Run Code Online (Sandbox Code Playgroud)
谢谢你的帮助.
我正在尝试在PHP中使用odbc_prepare和odbc_execute,如下所示:
$pstmt=odbc_prepare($odb_con,"select * from configured where param_name='?'");
$res=odbc_execute($pstmt,array('version'));
var_dump($res); //bool(true)
$row = odbc_fetch_array($pstmt);
var_dump($row); //bool(false)
Run Code Online (Sandbox Code Playgroud)
第一个var_dump返回true,因此执行成功,但没有返回任何行.param_name ='version'确实存在一行.为什么没有返回行?
为了让事情变得有趣,我使用准备好的插件在php中运行了另一个非常简单的示例.
$pstmt=odbc_prepare($odb_con,"insert into tmp1 values(?,'?')");
Run Code Online (Sandbox Code Playgroud)
这行本身就是在数据库中插入一行!! 当然这是错的?输入的数据是col 1 =空白,col 2 =?
任何关于从哪里开始修复此建议的建议将不胜感激,谢谢.
编辑:这是在PHP 5.2.8中
我想知道我是否可以准备一个执行多个查询的mysqli语句:
mysqli->prepare(query1 ...1,2,3 param...; query2...4,5 param...);
or
mysqli->prepare(insert into ...1,2,3 param...; insert into...4,5 param...);
and after all
mysqli->bind_param("sssss", 1, 2, 3, 4, 5);
Run Code Online (Sandbox Code Playgroud)
以这种方式它会产生错误:在...中的非对象上调用成员函数bind_param()
$stmt = $sql->getQueryPrepare("INSERT INTO user (id_user, username, pw, email) VALUES (?,?,?,?); INSERT INTO process (id_user, idp) VALUES (?,?);");
$stmt->bind_param("ssssss",$id, $username, $pw, $email, $id, $idp);
$stmt->execute();
$stmt->close();
Run Code Online (Sandbox Code Playgroud) 我一直在挖堆stackoverflow试图找到其他谁得到这些准备好的语句已存在错误.
在大多数情况下,使用after/before fork正确配置unicorn可以解决这些问题.
但是在我的情况下,我们仍然会遇到错误:
ActiveRecord::StatementInvalid: PG::Error: ERROR: prepared statement "a495" already exists: INSERT INTO "user_logins" ("account_id", "created_at", "ip_address", "user_agent", "user_id") VALUES ($1, $2, $3, $4, $5) RETURNING "id"
Run Code Online (Sandbox Code Playgroud)
这个错误在我们的应用程序的不同区域被抛出但似乎总是具有相同的语句号'a495'.
我们在轨道3.2.17,使用postgres,我们在heroku.
我真的不知道为什么会这样,但它现在开始更频繁地发生.
任何帮助将不胜感激.
在rails stack跟踪中,此错误将在.prepare调用中抛出.我很困惑,因为它检查了语句集合中的sql密钥.如果它不存在它准备新的....但是当试图准备它时,它抛出错误.
def prepare_statement(sql)
sql_key = sql_key(sql)
unless @statements.key? sql_key
nextkey = @statements.next_key
@connection.prepare nextkey, sql
@statements[sql_key] = nextkey
end
@statements[sql_key]
end
Run Code Online (Sandbox Code Playgroud) postgresql ruby-on-rails heroku prepared-statement ruby-on-rails-3.2
可以在PreparedStatement的.setObject方法可以用于任何类型的数据(String,Integer,Double,Date,DateTime,Byte Array而不是使用单独的MySQL支持等).setInt,.setDouble等的方法呢?
谢谢!
我使用PreparedStatement具有2000多个参数标记构建大型数据库调用.
我得到这个错误
Caused by: java.sql.SQLException: Prepared or callable statement has more than 2000 parameter markers.
at net.sourceforge.jtds.jdbc.SQLParser.parse(SQLParser.java:1139)
at net.sourceforge.jtds.jdbc.SQLParser.parse(SQLParser.java:156)
at net.sourceforge.jtds.jdbc.JtdsPreparedStatement.<init>(JtdsPreparedStatement.java:107)
Caused by: java.sql.SQLException: Prepared or callable statement has more than 2000 parameter markers.
Run Code Online (Sandbox Code Playgroud)
我尝试搜索API文档和谷歌但无法找到如何配置它.
有谁知道是否有可能达到这个限制?我知道这将是一个缓慢的数据库调用,但现在这很好.
从长远来看,这也会给我带来任何问题,我最好分批运行吗?