我有一个文件夹结构,两个文件夹分别命名为ComputerScience和Science
麻烦的是,当我需要将它们都匹配时,我的代码总是将变量检测为包含科学。
我正在使用
if (strpos($dir, "ComputerScience") !== FALSE) {
$my_full_path= $dir;
$sql = "UPDATE documents
SET subject = 'ComputerScience'
WHERE documentname='".$dir."'";
mysqli_query($link,$sql);
}
和
if (strpos($dir, "Science") !== FALSE) {
$my_full_path= $dir;
$sql = "UPDATE documents
SET subject = 'Science'
WHERE documentname='".$dir."'";
mysqli_query($link,$sql);
}
我猜测第二个代码块正在被匹配覆盖第一个代码块,如果$ dir变量包含该字符串,我该如何精确匹配该字符串?
谢谢
答案 0 :(得分:2)
理想情况下,您将添加目录分隔符以避免这些问题:
if (strpos($dir, "/ComputerScience/") !== FALSE) {
}
if (strpos($dir, "/Science/") !== FALSE) {
}
用文件系统的实际目录分隔符(/
或\
)替换/
。
答案 1 :(得分:1)
$subject = FALSE !== strpos($dir, "ComputerScience") ? 'ComputerScience' : (FALSE !== strpos($dir, "Science") ? 'Science' : null);
if (null !== $subject) {
$my_full_path= $dir;
$sql = "UPDATE documents
SET subject = '$subject'
WHERE documentname='".$dir."'";
mysqli_query($link,$sql);
}
也最好使用准备好的语句。他们指出,上面的代码减少了样板,因为您无需执行两次查询就可以编写类似的代码。如果解决方案与@Salman A相同,则可以执行相同的操作。这只是三元运算符的另一种选择。
答案 2 :(得分:0)
如果要匹配子字符串,则应始终寻找较长的匹配项,而不是较短的匹配项:
if (strpos($dir, "ComputerScience") !== FALSE) {
$sql = "UPDATE documents
SET subject = 'ComputerScience'
WHERE documentname='".$dir."'";
mysqli_query($link,$sql);
} elseif (strpos($dir, "Science") !== FALSE) {
$sql = "UPDATE documents
SET subject = 'Science'
WHERE documentname='".$dir."'";
mysqli_query($link,$sql);
}
您可以通过将匹配项首先存储在数组中来缩短代码:
$matches = ['ComputerScience', 'Science'];
foreach ($matches as $match) {
if (strpos($dir, $match) !== FALSE) {
$sql = "UPDATE documents
SET subject = '$match'
WHERE documentname='$dir' ";
mysqli_query($link, $sql);
break;
}
}
同样,较长的匹配在数组中排在第一位。您还可以使用字符串插值使SQL易于阅读。