这真令人沮丧。我有一个文本文件,我正在读取一个列入数组的部件号列表。我正在使用以下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语句中使用了很多次变量,但这确实让我感到难过。
答案 0 :(得分:2)
答案 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
调用的返回值,所以你不能确定查询执行正常。
我的想法:
foreach
mysql_query
答案 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/>";
}