相关疑难解决方法(0)

正则表达式负向前瞻

在我的主目录中,我有一个drupal-6.14文件夹,其中包含Drupal平台.

从这个目录我使用以下命令:

find drupal-6.14 -type f -iname '*' | grep -P 'drupal-6.14/(?!sites(?!/all|/default)).*' | xargs tar -czf drupal-6.14.tar.gz
Run Code Online (Sandbox Code Playgroud)

这个命令的作用是gzips文件夹drupal-6.14,不包括drupal-6.14/sites/ 除了sites/all和sites/default之外的所有子文件夹.

我的问题是关于正则表达式:

grep -P 'drupal-6.14/(?!sites(?!/all|/default)).*'
Run Code Online (Sandbox Code Playgroud)

该表达式可以排除我想要排除的所有文件夹,但我不太明白为什么.

使用正则表达式是一项常见任务

匹配所有字符串,但包含子模式x的字符串除外.或者换句话说,否定子模式.

我(想)我明白解决这些问题的一般策略是使用否定的前瞻,但我从来没有理解到正面和负面的外观(前瞻/后退)是如何工作的.

多年来,我已经阅读了很多网站.PHP和Python正则表达式手册,其他页面,如http://www.regular-expressions.info/lookaround.html等,但我从来没有真正理解它们.

有人可以解释,这是如何工作的,也许可以提供一些类似的例子来做类似的事情?

- 更新一:

关于Andomar的回应:双重否定前瞻可以更简洁地表达为单一的积极前瞻性陈述:

即是:

'drupal-6.14/(?!sites(?!/all|/default)).*'
Run Code Online (Sandbox Code Playgroud)

相当于:

'drupal-6.14/(?=sites(?:/all|/default)).*'
Run Code Online (Sandbox Code Playgroud)

???

- 更新二:

根据@andomar和@alan moore - 你不能互换双负前瞻以获得积极的前瞻.

regex lookahead negative-lookahead

57
推荐指数
3
解决办法
9万
查看次数

pdo准备了带有通配符的语句

我想执行以下mysql查询:

SELECT * FROM `gc_users` WHERE `name` LIKE '%anyname%'
Run Code Online (Sandbox Code Playgroud)

我尝试了这个没有成功:

$stmt = $dbh->prepare("SELECT * FROM `gc_users` WHERE `name` LIKE :name");
$stmt->bindParam(':name', "%" . $name . "%");
$stmt->execute();

$stmt = $dbh->prepare("SELECT * FROM `gc_users` WHERE `name` LIKE '%:name%'");
$stmt->bindParam(':name', $name);
$stmt->execute();
Run Code Online (Sandbox Code Playgroud)

所以我问你是否可以在预编译语句中使用%通配符.

/编辑

谢谢.它的工作原理是bindValue:

$stmt = $dbh->prepare("SELECT * FROM `gc_users` WHERE `name` LIKE :name");
$stmt->bindValue(':name', '%' . $name . '%');
$stmt->execute();
Run Code Online (Sandbox Code Playgroud)

php mysql pdo prepared-statement

30
推荐指数
1
解决办法
1万
查看次数

如何使用准备好的语句动态绑定参数?

我正在尝试为用户输入编写准备好的语句。参数编号是可变的,取决于用户输入。我正在尝试这个代码

php代码:

$string          = "my name";
$search_exploded = explode( " ", $string );
$num             = count( $search_exploded );
$cart            = array();
for ( $i = 1; $i <= $num; $i ++ ) {
    $cart[] = 's';
}
$str          = implode( '', $cart );
$inputArray[] = &$str;
$j            = count( $search_exploded );
for ( $i = 0; $i < $j; $i ++ ) {
    $inputArray[] = &$search_exploded[ $i ];
}
print_r( $inputArray );
foreach ( $search_exploded as $search_each ) {
    $x …
Run Code Online (Sandbox Code Playgroud)

php mysqli prepared-statement

4
推荐指数
1
解决办法
1514
查看次数

使用%通配符在PHP准备的语句中实现LIKE

我正在为数据库设置基本的搜索查询,并将其返回到表中。我在准备好的语句中使用的语法遇到了问题。

我基于w3schools示例创建了初始设置。

搜索输入来自上的表单html page。这称为php file

在中php file,我连接到SQL server并执行以下操作:

$search = $_POST['search'];

$stmt = $link->prepare("SELECT lname, fname FROM planner WHERE lname LIKE ?");
$stmt->bind_param('s', $search);
$stmt->execute();
$result = $stmt->get_result();

print_r($result);

if ($result->num_rows > 0) {
echo "<table><tr><th>Last Name</th><th>First Name</th></tr>";
while($row = $result->fetch_assoc()) {
    echo "<tr><td>".$row["lname"]."</td><td>".$row["fname"]."</td></tr>";
}
echo "</table>";
} else {
echo "0 results";
}
Run Code Online (Sandbox Code Playgroud)

我遇到的挑战是如何定义parametersLIKE以在准备好的语句构造中进行评估。W3Schools提供了许多LIKE parameters使用的各种组合的示例letters and %,但是我不确定将它们放在准备好的语句中的何处。我想将lname结果基于html页面上的表单提供的搜索条件。

该站点上的几篇旧文章都指向在字符串中设置条件。我不确定它是如何工作的。如果这是解决问题的好方法,我想了解更多有关此方法的信息。

感谢您提供的所有帮助。

php mysql

2
推荐指数
1
解决办法
2103
查看次数

从用户输入构建动态 PHP 准备语句

我有一个包含学生记录的数据库,大约有 50 列左右,所有这些都需要可搜索。我熟悉如何通过附加字段来构建动态搜索查询。我似乎找不到任何关于使用本质上是动态的准备好的语句搜索 MySQL 数据库的示例。例如,在搜索时您只会输入您需要搜索的字段,因此,您如何根据用户输入构建动态准备好的语句?

这是一个如何在没有准备好的语句的情况下执行此操作的示例,但是这很容易发生 SQL 注入。我需要用一个函数“清理”每个变量。但是,使用准备好的声明会更安全。

function clean($con,$var){
    $var = trim($var);
    $var = strtolower($var);
    $var = mysqli_real_escape_string($con,$var);
    return $var;
}

if(isset($_REQUEST['sub'])){

    if(isset($_REQUEST['student_fname'])){
        $student_fname = null;
        if($_REQUEST['student_fname'] != ''){
            $student_fname = '&& `student_fname` = \''.clean($con,$_REQUEST['student_fname']).'\' ';
        }
    }
    if(isset($_REQUEST['student_lname'])){
        $student_lname = null;
        if($_REQUEST['student_lname'] != ''){
            $student_lname = '&& `student_lname` = \''.clean($con,$_REQUEST['student_lname']).'\' ';
        }
    }

    $sql = "SELECT * FROM `student_records` 
    WHERE 1=1 
    $student_fname
    $student_lname
    ORDER BY class ASC, student_lname ASC";
    echo $sql;
}
Run Code Online (Sandbox Code Playgroud)

php mysql mysqli prepared-statement

0
推荐指数
1
解决办法
604
查看次数