Php 在mysqli_结果中接收内容
我正试图将这段代码从Java复制到php中,但我不知道如何获取行/列的内容 这是java代码:Php 在mysqli_结果中接收内容,php,mysql,database,Php,Mysql,Database,我正试图将这段代码从Java复制到php中,但我不知道如何获取行/列的内容 这是java代码: ResultSet resultsRS = statement.executeQuery("select distinct snum from shipments where quantity >= 100"); int rowCount=0; while(resultsRS.next()){ statement2.executeUpdate("UPDATE suppliers SE
ResultSet resultsRS = statement.executeQuery("select distinct snum from shipments where quantity >= 100");
int rowCount=0;
while(resultsRS.next()){
statement2.executeUpdate("UPDATE suppliers SET status = status + 5 WHERE snum = "+"\""+resultsRS.getString(1)+"\"");
rowCount++;
}
到目前为止,我在php中有以下内容:
$result2 = mysqli_query($database,"select distinct snum from shipments where quantity >= 100");
$rowCount = 0;
foreach($result2 as $shipment){
mysqli_query($database,"UPDATE suppliers SET status = status + 5 WHERE snum = "."\"".$shipment."\"");
rowCount++;
}
但这并没有达到预期效果
另外,如果您注意到我只想更新一个特定的列
编辑:开始工作了
对于所有阅读我的人,我都能通过以下代码得到我想要的:
for($counter=0; $row = mysqli_fetch_row($result2);$counter++){
foreach($row as $key=> $value){
mysqli_query($database,"UPDATE suppliers SET status = status + 5 WHERE snum = "."\"".$value."\"");
$rowCount++;
}
}
您应该阅读PHP MYSQLI文档:
<?php
$mysqli = new mysqli("localhost", "my_user", "my_password", "world");
/* check connection */
if (mysqli_connect_errno()) {
printf("Connect failed: %s\n", mysqli_connect_error());
exit();
}
$query = "SELECT Name, CountryCode FROM City ORDER by ID DESC LIMIT 50,5";
if ($result = $mysqli->query($query)) {
/* fetch associative array */
while ($row = $result->fetch_assoc()) {
printf ("%s (%s)\n", $row["Name"], $row["CountryCode"]);
}
/* free result set */
$result->free();
}
/* close connection */
$mysqli->close();
?>
从中,您可以在php.net网站上阅读它()
mysqli_查询
返回一个mysqli_结果
对象()
您必须使用fetch.*
函数之一从结果中提取行
例如:
$result2 = mysqli_query($database,"select distinct snum from shipments where quantity >= 100");
$rowCount = 0;
while($shipment = $result2->fetch_assoc()){
mysqli_query($database,"UPDATE suppliers SET status = status + 5 WHERE snum = "."\"".$shipment['snum']."\"");
rowCount++;
}
处理这种情况的“最佳实践”解决方案是首先在循环外部“准备”查询,然后在循环期间将参数绑定到查询。这避免了SQL注入;虽然在这种特定情况下,这可能不是一个问题,但最好不要直接在查询中注入数据,而是始终使用参数绑定。它看起来也更漂亮,更容易理解,没有那些引用的废话:)
您可能还希望通过首先收集所有ID,然后为整批ID发出一条update语句来优化这一点
此外,我希望您能够使用单个查询完成此操作,对连接执行更新。。。因此,如果性能是一个考虑因素,那么您可能也需要考虑这一点。实际上,文档中指出,自PHP5.4以来,mysqli_查询返回的mysqli_结果对象实现了可遍历接口,因此可以直接对其进行迭代。我也对询问者的代码感到惊讶,但现在它似乎确实有效。哦,我明白了,很高兴知道这一点。虽然在工作中我们被5.3困住了,也许这就是为什么我错过了。但在任何情况下,我想你们还是要把它当作一个列的集合。因此,您必须使用
$shipping['snum']
而不是简单地使用$shipping
。's'在bind_参数中是什么意思?我从代码中得到的也是“对非对象调用成员函数bind_param()”。第一个参数指示您绑定的参数的类型。S代表字符串,i代表整数。既然你在sNum周围加了引号,我就把它绑定成一个字符串。。。整数可能更有意义。这就是我没有在本地mysqli连接上尝试它的原因。我已经用错误处理更新了代码示例,这样您就可以看到哪里出了问题。啊,很好,谢谢。最后一个问题。bind_param实际上会包含带引号的字符串吗?例如,在where snum=“where”中创建查询
$result2 = mysqli_query($database,"select distinct snum from shipments where quantity >= 100");
$query = mysqli_prepare($database, 'UPDATE suppliers SET status = status + 5 WHERE snum = ?');
// Check for errors. This is obviously not the right way to handle this when going into production...
if(!$query) {
var_dump(mysqli_error($database));
die();
}
foreach($result2 as $shipment){
$snum = $shipment['snum'];
$query->bind_param('s', $snum);
$query->execute();
$rowCount++;
}