【问题标题】:[PHP/MySQL]: Prepared Statement in a loop[PHP/MySQL]:循环中的预处理语句
【发布时间】:2014-02-05 10:29:55
【问题描述】:

我的问题对我来说似乎是一个相当小的问题,但我无法找到合适的解决方案。 设置:我有一个表“city_locations”,其中包含“国家”、“城市”、“经度”、“纬度”等列。国家由 2 个字母的 ISO 代码给出。我希望它们是全名。

为此,我导入了“countrycodes”表,其中仅包含“name”和“code”列。

$namechange = $con->prepare("UPDATE city_locations SET country=? WHERE country=?");

$list = $con->prepare("SELECT name, code FROM countrycodes");
$list->execute();
$list->bind_result($name, $code);

$namechange->bind_param('ss', $name, $code);

while ($list->fetch()){
    while ($namechange->execute()) {}
    echo "$code is now $name <br>";
}

我成功检索了(外部)while 循环中的所有对。

$namechange->execute();但是什么也没做 - 我尝试了使用和不使用 while 循环,尝试在查询中使用 LIMIT 0, 10000 (尽管我不完全确定我理解 LIMIT 是否正确)。无论有没有 while 循环,该语句都不会做任何事情。使用 LIMIT 0, 10000 时,语句无法正确预置(给出错误)。

我还尝试在 while 循环的每个步骤中绑定新参数 - 似乎也没有做任何事情。

从我的网络界面运行相同的命令时,它工作正常。但是,在这种情况下,我必须手动输入所有 200 多个代码。工作量好像有点大。

非常感谢您的帮助, 凯杰尔德。

编辑:$con 的类型是 mysqli。

【问题讨论】:

  • 这是mysqli。那么,它会给我表格的前 10.000 个还是适合我查询的第一个 10.000 个?
  • 它将从索引 0 -> 10.000 返回
  • @JeroenBollen mysqli OO 风格
  • 切题的问题:改用 PDO 会更聪明还是更多的是品味问题?我的项目还处于早期阶段(不到 1000 行代码),并且肯定愿意改变。
  • 绑定参数不应该在第一个while循环内吗?

标签: php mysql loops mysqli prepared-statement


【解决方案1】:
$namechange = $con->prepare("UPDATE city_locations SET country=? WHERE country=?");
$list = $con->prepare("SELECT name, code FROM countrycodes");
$list->execute();
$list->bind_result($name, $code);



while ($list->fetch()){
    $namechange->bind_param('ss', $name, $code);
    $namechange->execute();

    echo "$code is now $name <br>";
}

它可能会解决你的问题。

【讨论】:

  • 所以我们最终得到了一个甚至没有尝试提供error messages 的问题、一个未注释的代码转储作为答案以及一个带有“不起作用”注释的已接受答案标志。这对以后浏览这里的人非常有帮助。
  • 没有错误消息,即使使用 error_reporting(E_ALL); (除了由于不正确的查询导致的准备好的语句失败)。由于几乎每个人都评论说这将是正确的解决方案,我认为这是正确的方法,通常对其他人有用(如前所述,我已经决定我什至不想再解决我的问题了)。如果您认为删除正确答案更符合 SO 的一般准则,我会这样做。
  • 更新:在处理相关问题时,我意识到在导入 .csv 文件时所有“代码”条目都保留了换行符。再次快速导入表格,我出于好奇尝试了这个解决方案,它奏效了。
  • @KjeldSchmidt mysqli 扩展具有(恕我直言,数量荒谬的)获取错误消息的函数,它们不会自称——我评论中的蓝色单词是其中一个的链接.如果您最终弄清楚问题出在哪里以及这段代码将如何解决它,最有用的做法是编辑答案并添加一些解释。如果您没有足够的代表,那么评论也很棒。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-01
  • 2014-02-05
  • 2012-01-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多