Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 通过按下链接并转义反斜杠来运行MySQL查询_Php_Mysql - Fatal编程技术网

Php 通过按下链接并转义反斜杠来运行MySQL查询

Php 通过按下链接并转义反斜杠来运行MySQL查询,php,mysql,Php,Mysql,下面的PHP代码将MySQL查询的结果打印到HTML表中。此外,在表中,我创建了一个结果链接,该链接将在另一个查询中使用。让我们看一下代码: <?php /* Attempt MySQL server connection. Assuming you are running MySQL server with default setting (user 'root' with no password) */ $link = mysqli_connect("localhost", "root

下面的PHP代码将MySQL查询的结果打印到HTML表中。此外,在表中,我创建了一个结果链接,该链接将在另一个查询中使用。让我们看一下代码:

<?php
/* Attempt MySQL server connection. Assuming you are running MySQL
server with default setting (user 'root' with no password) */
$link = mysqli_connect("localhost", "root", "root", "DB1");

// Check connection
if($link === false){
    die("ERROR: Could not connect. " . mysqli_connect_error());
}

// Attempt select query execution
$sql = "SELECT * FROM fileDB";
if($result = mysqli_query($link, $sql)){
    if(mysqli_num_rows($result) > 0){
        echo "<table>";
            echo "<tr>";
                echo "<th>filename</th>";
                echo "<th>filepath</th>";
                echo "<th>size</th>";
            echo "</tr>";
        while($row = mysqli_fetch_array($result)){
            echo "<tr>";
                echo "<td><a href='http://mysecreturl.com/test.php?path=" . $row['filepath'] . "'>" . $row['filename'] . "<a/></td>";
                echo "<td>" . $row['filepath'] . "</td>";
                echo "<td>" . $row['size'] . "</td>";
            echo "</tr>";
        }
        echo "</table>";
        // Free result set
        mysqli_free_result($result);
    } else{
        echo "No records matching your query were found.";
    }
} else{
    echo "ERROR: Could not able to execute $sql. " . mysqli_error($link);
}

// Close connection
mysqli_close($link);
?>

这段代码按预期工作,但现在出现了一个问题:我想实现以下功能:单击链接后,应该执行另一个查询,这是一个特定的查询:
SELECT*FROM fileDB,其中filepath='从链接发送的查询'
。我想在第二个查询中使用类似于
$\u GET[“filepath”]
的链接来设置文件路径。我在这方面有两个主要问题:

  • 我不懂PHP,所以我不知道点击一个链接如何运行另一个查询并生成一个包含结果的新表

  • 需要指出的是,filepath是Windows路径的一个字符串,因此它包含如下反斜杠:
    C:\something\something
    等。当我在phpMyAdmin中手动查询时,我通过写入
    C:\\something\\something
    来避免反斜杠,但是当从上面的代码在表中获得结果时,字符串文件路径当然会有一对反斜杠(因为它保存在数据库中)。如果反斜杠显然需要转义,那么如何执行第二个查询


  • 非常感谢您的帮助

    您可以这样做:

    echo '<tr>
     <td><form method="get" action="test.php">
           <button type="submit" name="path" value="'.$row['filepath'].'">
    '.$row['filename'].'</button>
    </form></td>
    <td>'.$row['filepath'].'</td>
    <td>'.$row['size'].'</td>
    </tr>';
    
    echo'
    “.$row['filename']”
    “.$row['filepath']”
    “.$row['size']”
    ';
    
    未经测试,但在理论上应该有效。为什么链接在filename表单元格中,而不是包含实际路径的表单元格中,天知道,但是您可以测试它,看看它是否有效


    但是,我只想将其编入$_帖子,除非在地址栏中显示URI很重要。

    要回答第一个问题,您可以向链接添加变量,例如,如果您想在链接中传递名字和姓氏,您可以这样做

    <?php
    $fname = "John"; // First name
    $lname = "Doe"; // Last Name
    
    echo "<a href='next_table.php?fname=$fname&lname=$lname'>Next Table</a>";
    ?>
    
    
    
    然后,要在另一个页面上检索名字和姓氏,可以使用以下命令:

    <?php
    $fname = $_GET["fname"];
    $lname = $_GET["lname"];
    ?>
    
    
    

    请告诉我这是否有帮助。

    现在可以使用get方法(如
    )完成此操作,然后在您的php中使用此
    更改代码:

    // Attempt select query execution
    $sql = "SELECT * FROM fileDB";
    if($result = mysqli_query($link, $sql)){
    
    致:


    这应该传达基本思想,但要牢记使用参数化查询。

    只是一个if语句,用于检查文件路径是否已设置,以及
    stru replace
    函数以避免反斜杠

       <?php
        /* Attempt MySQL server connection. Assuming you are running MySQL
        server with default setting (user 'root' with no password) */
        $link = mysqli_connect("localhost", "root", "root", "DB1");
    
        // Check connection
        if($link === false){
            die("ERROR: Could not connect. " . mysqli_connect_error());
        }
    
        // Attempt select query execution 
        // Check If filpath is set or not
        if(!isset($_GET['filepath']))
        { 
        $sql = "SELECT * FROM fileDB";
        }
       else
        {
    
        $filepath=$_GET['filepath'];
        //replace backlashes with double backlashes using str_replace
        $filepath=str_replace('\\','\\\/',$filepath);  
        $sql = "SELECT * FROM fileDB WHERE filepath='$filepath'";
        }
        if($result = mysqli_query($link, $sql)){
            if(mysqli_num_rows($result) > 0){
                echo "<table>";
                    echo "<tr>";
                        echo "<th>filename</th>";
                        echo "<th>filepath</th>";
                        echo "<th>size</th>";
                    echo "</tr>";
                while($row = mysqli_fetch_array($result)){
                    echo "<tr>";
                        echo "<td><a href='http://mysecreturl.com/test.php?path=" . $row['filepath'] . "'>" . $row['filename'] . "<a/></td>";
                        echo "<td>" . $row['filepath'] . "</td>";
                        echo "<td>" . $row['size'] . "</td>";
                    echo "</tr>";
                }
                echo "</table>";
                // Free result set
                mysqli_free_result($result);
            } else{
                echo "No records matching your query were found.";
            }
        } else{
            echo "ERROR: Could not able to execute $sql. " . mysqli_error($link);
        }
    
    
    
    // Close connection
    mysqli_close($link);
    ?>
    

    我以为你想下载一个文件。这要简单得多:

    if (isset($_GET["path"])) {
        $stmt = mysqli_prepare($link, "SELECT * FROM fileDB WHERE filepath = ?");
        mysqli_stmt_bind_param($stmt, "s", $_GET["path"]);          
    }else{
        $stmt = mysqli_prepare($link, "SELECT * FROM fileDB");      
    }
    mysqli_stmt_execute($stmt);
    
    if ($result = mysqli_stmt_get_result($stmt)) {
        if(mysqli_num_rows($result) > 0){
        ...
    

    哦,还有一件事,您应该在URL中转义查询组件

    echo "<td><a href='http://mysecreturl.com/test.php?path=" . urlencode($row['filepath']) . "'>" . $row['filename'] . "<a/></td>";
    
    echo”“$行['filename']。"";
    

    或准备好的语句。实际上,只是准备好的语句。停止使用不推荐的、糟糕的做法。阅读“准备好的语句”,PHP只需要一个带有
    method=“get”
    的表单来获取所需的内容(当用户单击“链接”(实际上是表中表单中的一个按钮)即可然后它被粘贴到链接上,并从那里解析。这是非常简单的PHP/表单控件,在服务器端添加了SQL。文件test.PHP,这和你的问题中的文件是同一个文件吗?@sloarthrasher是的!@junkfoodjunkie我想是的,我想一旦理解了这个概念,我就可以使用准备好的语句了。但正如我所理解的d这是从这里开始的最好方式。你能帮我吗?我非常感谢!我甚至不需要按钮,第二个查询应该在你按下链接时直接运行,并给出另一组结果。请使用准备好的语句,这是必须的。我们不要教新人坏习惯。同意,但OP是新的,我同意他试图说明他需要理解的许多事情中的一件。保持简单。请使用准备好的语句,这是必须的。我们不要教新人坏习惯。@Peter,我求求你,你能告诉我怎么做吗?我保证一旦完成这件事,我会阅读PHP和准备好的语句!我也是新手,我是索尔文就我目前所知,他有问题。@Peter,如果你(我猜)因为他们的答案不使用预先准备好的语句,所以他们将否决其他答案,至少添加一个使用它们的答案。将为我提供答案解决我使用预先准备好的语句的问题的答案将获得追加投票,答案将被接受。你不能在字符串变量中使用单引号stringTrue,我猜是伏特加俄罗斯标准是罪魁祸首。Meh-缺少结尾引用-我复制时一定没有包含。现在已修复。好吧,我认为我们现在接近了,唯一的问题是,当我按下链接时,它只更新页面,但新的查询没有执行,我没有得到新的结果集。为什么@Peter@HK007不,你不需要这就是我们准备好的原因statements@HK007DBMS是这样做的,这就是为什么要使用准备好的语句的原因。开发人员不应该去做它。手动地跳过字符串是PHP的老黑暗时代。@ L.S.抱歉是一种痛苦,但是您应该真正考虑使用<代码> ID <代码>,而不是像我提到的文件一样。ned在另一个回答中说,我以为你想下载文件。如果这是一个公共应用程序,它会打到你的脸上。不仅攻击者知道你的目录结构,查询速度较慢,而且如果你选择更改文件路径,有一天所有链接到你网站的网站都将失效-dated@L.S不,只使用自动递增ID,这是最好的选择。每个人都这样做。一些网站,如youtube或imgur,使用字符字符串作为ID,如
    6Pjpj
    ,因为它们可以处理数以百万计的人,并且你可以在更短的字符串中压缩更多的ID。A-Z+0-9是36长,所以你可以在5字符字符串中压缩36^5,而如果你只使用数字,则可以压缩10^5。ID=53245761283一点也不性感:)但iirc facebook就是这么做的
    echo "<td><a href='http://mysecreturl.com/test.php?path=" . urlencode($row['filepath']) . "'>" . $row['filename'] . "<a/></td>";