为了账号安全,请及时绑定邮箱和手机立即绑定

PHP文件无法输入部分代码

/ 猿问

PHP文件无法输入部分代码

慕村9548890 2019-10-22 22:40:53

这是我的php文件中的一个函数,用于满足我的android应用程序的请求。


function checkin($DB, $TechID, $ClientID, $SiteID){

    $dbConnection = mysql_connect($DB['server'], $DB['loginName'], $DB['password']);

    if(!$dbConnection){

        die('Error! ' . mysql_error());

        }

    mysql_select_db($DB['database'], $dbConnection);


    $file2 = "C:/wamp/www/file2.txt";

    $data2 = "ClientID:".$ClientID." TechID:".$TechID." SiteID:".$SiteID;

    file_put_contents($file2, $data2);


    $result1 = mysql_query("SELECT COUNT(*) FROM Log") or die('Error! ' . mysql_error());

    $query = "SELECT `Type` FROM `Log` WHERE `TechID` = '".$TechID."' ORDER BY LogTime DESC LIMIT 1";

    $file5 = "C:/wamp/www/file5.txt";

    file_put_contents($file5, $query);

    $result2 = mysql_query($query) or die('Error! ' . mysql_error());

    while($row1 = mysql_fetch_array($result1)){

        $count = $row1['COUNT(*)'];

        $file3 = "C:/wamp/www/file3.txt";

        $data3 = "ClientID:".$ClientID." TechID:".$TechID." SiteID:".$SiteID." Count:".$count;

        file_put_contents($file3, $data3);

        while($row2 = mysql_fetch_array($result2)){

            $file4 = "C:/wamp/www/file4.txt";

            $data3 = "ClientID:".$ClientID." TechID:".$TechID." SiteID:".$SiteID." Count:".$count;

            file_put_contents($file4, $data3);

            /*if($row2['Type']!="Checkin"){

                $count = $count+1;

                $Time = date('Y/m/d H:i');

                mysql_query("INSERT INTO Log (LogID, TechID, ClientID, SiteID, LogTime, Type)

                            VALUES (".$count.", ".$TechID.", ".$ClientID.", ".$SiteID.", ".$Time.", Checkin)");

             }else{

                $query2 = "SELECT TechEmail FROM Tech WHERE TechID=".$TechID;

                $result3 = mysql_query($query2) or die('Error! ' . mysql_error());

                }

            }*/

        }

    }

}

您会看到我已经隐藏了一些代码,因为我正在调试它,所以创建了一些文件只是为了查看代码的哪一部分无法执行。我发现程序无法进入应创建file4的区域。我已经发现问题可能出在$ query上,当它执行时,mysql会响应“未知表状态:TABLE_TYPE”,这我不明白为什么。


查看完整描述

3 回答

?
翻过高山走不出你

如上面的注释中所述,您应该分而治之,以使您的生活更轻松(尤其是当您在该大型函数中使用代码时编写代码)。确实很容易做到:


function file_put($number, $data)

{

    $path = sprintf("C:/temp/wamp/www/file%d.txt", $number);

    file_put_contents($path, $data);

}

例如,这只是替换许多重复的行,您只需要在其中放入一些(编号)文件即可。


但是您也可以使用更复杂的内容(例如数据库操作)来执行此操作。您可能希望将错误处理移到您的视线之外,并在需要时小心地连接到数据库,并以更灵活的方式来获取数据。可以通过将(已弃用的)mysql_*函数移至其自己的一两个类中来完成,以使它不被看到。这将使它的使用更加容易(我首先显示):


// Create your database object to use it later on:

$config = array(

    'server' => 'localhost',

    'name' => 'root',

    'password' => '',

    'db' => 'test',

);

$db = new MySql($config);

我称它为数据库类,MySql因为它代表了mysql连接,并且可以与旧的mysql扩展一起使用。您只需要将该数据库对象传递给问题中的函数即可。结合file_put功能,它看起来像这样:


function checkin(MySql $DB, $TechID, $ClientID, $SiteID)

{

    $query = sprintf("SELECT `Type` FROM `Log` WHERE `TechID` = '%d' ORDER BY LogTime DESC LIMIT 1", $TechID);

    file_put(5, $query);


    $result1 = $DB->query("SELECT COUNT(*) FROM Log");    

    $result2 = $DB->query($query);


    foreach ($result1 as $row1) {

        list($count) = $row1;

        $data = "ClientID:$ClientID TechID:$TechID SiteID:$SiteID Count:$count"

        file_put(3, $data);

        foreach ($result2 as $row2) {

            file_put(4, $data);

        }

    }

}

该checkin函数仍然接近大型(已经有12行代码),但是比您的第一个版本短得多,因为它委派了编写文件和访问数据库的工作。我希望这个示范有用。以下是完整的代码示例:


/**

 * MySql Exception

 */

class MySqlException extends RuntimeException

{

}


/**

 * MySql Database Class

 */

class MySql

{

    private $server;

    private $name;

    private $password;

    private $db;

    private $connection;


    public function __construct(array $config)

    {

        $this->server = $config['server'];

        $this->name = $config['name'];

        $this->password = $config['password'];

        $this->db = $config['db'];

    }


    private function connect($server, $name, $password)

    {

        $this->connection = mysql_connect($server, $name, $password);

        if (!$this->connection) {

            $this->error("Unable to connect to '%s' as user '%s'", $server, $name);

        }

    }


    private function select($db)

    {

        if (!mysql_select_db($db, $this->connection)) {

            $this->error("Unable to select database '%s'", $db);

        }

    }


    private function close()

    {

        $this->connection && mysql_close($this->connection);

    }


    private function connectSelect()

    {

        $this->connect($this->server, $this->name, $this->password);

        $this->select($this->db);

    }


    /**

     * @param $query

     * @return MySqlResult

     */

    public function query($query)

    {

        $this->connection || $this->connectSelect();

        $result = mysql_query($query, $this->connection);

        if (!$result) {

            $this->error("Unable to execute query '%s'", $query);

        }

        return new MySqlResult($result);

    }


    /**

     * @param string $format

     * @param ...

     * @throws MySqlException

     */

    private function error($format)

    {

        $args = func_get_args();

        array_shift($args);

        $format .= ': %s';

        $args[] = $this->connection ? mysql_error($this->connection) : mysql_error();

        throw new MySqlException(vsprintf($format, $args));

    }


    public function __destruct()

    {

        $this->close();

    }

}


/**

 * MySql Result Set - Array Based

 */

class MySqlResult implements Iterator, Countable

{

    private $result;

    private $index = 0;

    private $current;


    public function __construct($result)

    {

        $this->result = $result;

    }


    public function fetch($result_type = MYSQL_BOTH)

    {

        $this->current = mysql_fetch_array($this->result, $result_type);

        return $this->current;

    }


    /**

     * Return the current element

     * @link http://php.net/manual/en/iterator.current.php

     * @return array

     */

    public function current()

    {

        return $this->current;

    }


    public function next()

    {

        $this->current && $this->fetch();

    }


    /**

     * Return the key of the current element

     * @link http://php.net/manual/en/iterator.key.php

     * @return mixed scalar on success, or null on failure.

     */

    public function key()

    {

        return $this->current ? $this->index : null;

    }


    /**

     * Checks if current position is valid

     * @link http://php.net/manual/en/iterator.valid.php

     * @return boolean The return value will be casted to boolean and then evaluated.

     * Returns true on success or false on failure.

     */

    public function valid()

    {

        return (bool)$this->current;

    }


    /**

     * Rewind the Iterator to the first element

     * @link http://php.net/manual/en/iterator.rewind.php

     * @return void Any returned value is ignored.

     */

    public function rewind()

    {

        $this->fetch();

    }


    /**

     * Count of rows.

     *

     * @link http://php.net/manual/en/countable.count.php

     * @return int The count of rows as an integer.

     */

    public function count()

    {

        return mysql_num_rows($this->result);

    }

}


// Create your database object to use it later on:

$config = array(

    'server' => 'localhost',

    'name' => 'root',

    'password' => '',

    'db' => 'test',

);

$db = new MySql($config);


function file_put($number, $data)

{

    $path = sprintf("C:/temp/wamp/www/file%d.txt", $number);

    file_put_contents($path, $data);

}


function checkin(MySql $DB, $TechID, $ClientID, $SiteID)

{

    $query = sprintf("SELECT `Type` FROM `Log` WHERE `TechID` = '%d' ORDER BY LogTime DESC LIMIT 1", $TechID);

    file_put(5, $query);


    $result1 = $DB->query("SELECT COUNT(*) FROM Log");    

    $result2 = $DB->query($query);


    foreach ($result1 as $row1) {

        list($count) = $row1;

        $data = "ClientID:$ClientID TechID:$TechID SiteID:$SiteID Count:$count";

        file_put(3, $data);

        foreach ($result2 as $row2) {

            file_put(4, $data);

        }

    }

}


checkin($db, 1, 2, 3, 4);


查看完整回答
反对 回复 2019-10-22
?
慕神8447489

简单的答案应该是:


mysql_query("INSERT INTO Log (LogID, TechID, ClientID, SiteID, LogTime, Type)

                        VALUES (".$count.", ".$TechID.", ".$ClientID.", ".$SiteID.", ".$Time.", Checkin)");

从$ vars中删除引号。或单引号。同时删除点。喜欢:


mysql_query("INSERT INTO Log (LogID, TechID, ClientID, SiteID, LogTime, Type)

                        VALUES ('$count', '$TechID', '$ClientID', '$SiteID', '$Time', Checkin)");


查看完整回答
反对 回复 2019-10-22
?
大话西游666

另请参阅:如何使用不推荐使用的mysql_ *函数成功重写旧的mysql-php代码?-将这些旧功能移入数据库类后,您可以稍后在一个中央位置替换它们,而代码库的另一部分已经得到改善。


查看完整回答
反对 回复 2019-10-22

添加回答

回复

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信