我想使用一个字符串获取一行,但是该字符串用于验证多于1列,例如5列
-----------------------------------------------
| id | code | 1 | 2 | 3 | 4 | 5 |
-----------------------------------------------
| 01 | Number | 5 | 7 | 10 | 21 | 1 |
| 02 | String | v | q | s | f | w |
| | | | | | | |
| | | | | | | |
| | | | | | | |
-----------------------------------------------
如果要使用循环方法,我想使用5列(1,2,3,4,5)进行SELECT mysqli,这会浪费很多时间
我已尝试使用此代码解决问题
$value = "q";
for ($x = 1; $x <= 5; $x++) {
$cek = mysqli_query($con,"SELECT * FROM table where $x='$value' and id='02'")
if(mysqli_num_rows($cek) == 1) {
echo "success";
} else {
echo "fail";
}
}
我成功使用了此代码,但是过程太长了
有没有更简单,更实用的方法来克服此问题?谢谢
答案 0 :(得分:2)
正如评论中指出的那样,您的数据库设计不是最佳的。您可能需要重新考虑并进行更改。另外,将列名设置为1
,2
等,这是非常的主意。至少让他们以字母开头。更好的是,给他们一些合理的名称,指示这些列实际包含的数据。
现在,假设您弄清楚了列名的真实含义,则可以使用简单的IN
运算符来获取数据。常用/常用的方法是
WHERE some_column IN ('value1', 'value2', ...)
但是,没有什么可以阻止您以其他方式使用它:
WHERE 'some_value' IN (column1, column2, ...)
这样,您的SQL语句将变成这样:
SELECT *
FROM table
WHERE '$value' IN (column1, column2, column3, column4, column5)
AND id='02'
现在,如果您将列名放在数组中,则可以通过以下方式做到这一点:
$testColumns = ['column1', 'column2', 'column3', 'column4', 'column5'];
$value = "q";
$inColumns = implode(',', $testColumns);
$sql = "SELECT * FROM table WHERE '$value' IN ($inColumns) AND id='02'";
$cek = mysqli_query($con, $sql);
更新:如果您的列名是非标准的,例如前面提到的1
,2
等,或者其中有空格,则简单的implode
将不起作用,因为您需要对每个列名加反引号。在这种情况下,您将需要以下内容:
$inColumns = implode(',', array_map(function($c) { return "`$c`"; }, $columns));