PHP sql与foreach循环变量问题

时间:2010-06-11 19:26:58

标签: php sql mysql foreach

这真令人沮丧。我有一个文本文件,我正在读取一个列入数组的部件号列表。我正在使用以下foreach函数来搜索数据库中的匹配数字。

$file = file('parts_array.txt');

foreach ($file as $newPart)
{
    $sql = "SELECT products_sku FROM products WHERE products_sku='" . $newPart . "'";
    $rs = mysql_query($sql);
    $num_rows = mysql_num_rows($rs);

    echo $num_rows;
    echo "<br />";
}

问题是我从mysql_num_rows返回了0行。我可以在没有变量的情况下输入sql语句,它可以很好地工作。我甚至可以从这个脚本中回显出sql语句,从浏览器中复制并粘贴语句并且它可以工作。但是,由于某种原因,当我使用变量时,我没有得到任何记录。我已经在sql语句中使用了很多次变量,但这确实让我感到难过。

6 个答案:

答案 0 :(得分:2)

  1. 在变量上尝试修剪和mysql_real_escape_string。
  2. 检查正在回显的内容的源代码,并尝试将其复制并粘贴到PHPMyAdmin或类似内容中。

答案 1 :(得分:1)

file包含数组元素中的换行符。这可以解释为什么在复制浏览器输出但不在脚本中时它可以工作。您可以尝试:

$file = file('parts_array.txt', FILE_IGNORE_NEW_LINES);

或:

$sql = "SELECT products_sku FROM products WHERE products_sku='" . trim($newPart) . "'";

注意:即使您从自己制作的文件导入,也绝不能100%确定没有插入可注入的数据。您应确保使用mysql_real_escape_string正确转义任何数据。更好的是使用PDO准备的语句。​​

答案 2 :(得分:0)

显然,您的代码会执行与您预期不同的操作。运行一个成功的查询,一个:你没有检查mysql_query调用的返回值,所以你不能确定查询执行正常。

我的想法:

  1. foreach
  2. 转储您的sql语句
  3. 检查mysql_query
  4. 的返回代码

答案 3 :(得分:0)

您的parts_array.txt文件是什么样的? SKU号码是否包含'字符?

请你试试这个:

$file = file('parts_array.txt');

foreach ($file as $line_num => $line)
{
    $sql = "SELECT products_sku FROM products WHERE products_sku='$line'";
    echo $sql;
    $rs = mysql_query($sql);
    $num_rows = mysql_num_rows($rs);

    echo $num_rows;
    echo "<br />";
}

答案 4 :(得分:0)

您可能想要检查mysql_error。听起来你已经验证了变量并将查询复制到PHPMyAdmin或Query Browser这样的数据库界面中,但是如果你没有,我会建议你这样做。
之后,验证一个非常基本的查询是否有效,例如SELECT * FROM Products。这将告诉您查询之外是否存在问题。

总的来说,我会说策略是将问题分解为可能的问题区域,例如数据库,连接,查询,错误等。尝试一次消除它们,直到问题显而易见。换句话说,列出可能性并一次一个地交叉。

我之前遇到过这样的问题;诀窍通常是在你看到问题之前开始回应事物,而不是假设。

答案 5 :(得分:0)

我知道现在已经很久了 - 但是我想帮助那些可能也面临类似问题的人,他们需要包含可能无限数量生成的搜索参数的SQL语句。

问题中的代码完全有效(为避免疑问)[见下文]:

$file = file('parts_array.txt');

foreach ($file as $newPart)
{
    $sql = "SELECT products_sku FROM products WHERE products_sku='" . $newPart . "'";
    $rs = mysql_query($sql);
    $num_rows = mysql_num_rows($rs);

echo $num_rows; 
echo "<br />";

}

他们的问题在于文本文件的格式化('parts_array.txt')。可以通过转储服务器发回的信息来跟踪问题的根本原因。或者 - 他们可以尝试在PHPMyAdmin中编写SQL查询并粘贴其文本文件中的部分或全部数据。 MySQL会很高兴地折磨它们,直到找到问题为止。

对于那些试图实现基于变量的SQL查询的人来说,上面是可行的方法。 如果您尝试从数组中获取数据而不是文本文件,则可以执行以下操作:

foreach ($array as $array_stuff)
{
    $search_query = "SELECT * FROM table WHERE id='" . $array_stuff . "'";
    $rs = mysqli_query($database_connection, $search_query);
    $table_rows = mysqli_fetch_assoc($rs);

    echo $table_rows['id']." - ".$table_rows['desc'];
    echo "<br />";
}

/* free result set */
mysqli_free_result($rs);

这将输出您的数据:

  

1001 - 数据1
1002 - 数据2
1003 - 数据3

注意:MySQL不鼓励使用“mysql”函数。因此,我上面给出的第二个例子是使用当前技术更新,并使用“mysqli”代替。

同样重要

如果您是因为尝试从数据库中获取数据而使用复杂的SQL查询而来自Google搜索 - 您可能已尝试执行类似下面的示例(或正在考虑它)。

不要尝试编写基于变量的SQL查询,如下例所示。 它将无法正常工作并且令人难以置信地令人沮丧。

基于最近的技术进步 - 我给出的第二个例子(使用“mysqli”)是正确的方法(如果有的话)来实现这一目标。

错误的例子:

if ($search_result = mysqli_query($dbh1, "SELECT FROM sic_codes WHERE id = (".foreach ($_POST['SIC_Codes'] as $sic_codes) {echo "'".$sic_codes."' OR id = '',";})) {
/* fetch associative array */
while ($search_row = mysqli_fetch_assoc($search_result)) {
    echo $row["id"]." - ".$row["desc"]."<br/>";
}