0

预先,我几乎没有 php 编码技能,所以如果我问的是非常基本的问题,请原谅。

我想创建一个 php 文件,我可以通过在非 modx 数据库中创建友好 URL 的 cron 作业执行。我有一个表“myuri”,它有 3 列“id”“title”“uri”(uri 默认为 NULL)

这是脚本应该做的事情

  • 连接到数据库服务器
  • 选择数据库
  • 使用从相应“标题”字段中的每个标题创建的友好 URL 更新所有为 NULL 的“uri”字段

凭借对我正在做的事情的非常基本的了解,我只设法将一些 php 和 xPDO 的代码片段混合在一起,这些代码正在做某事,但不是我需要的。

到目前为止,我所拥有的是 modx xPDO 和 SQL 的混合体

// [PHP/SQL] db connect
mysql_connect("hostname", "user", "password");
mysql_select_db("database");

// [xPDO] path
define('MODX_CORE_PATH', '/website/domain.tld/core/');
define('MODX_CONFIG_KEY','config');
require_once MODX_CORE_PATH . 'model/modx/modx.class.php';

// [xPDO] Criteria for foreign Database
$host = 'hostname';
$username = 'user';
$password = 'password';
$dbname = 'database';
$port = 3306;
$charset = 'utf-8';

$dsn = "mysql:host=$host;dbname=$dbname;port=$port;charset=$charset";
$xpdo = new xPDO($dsn, $username, $password);

// [PHP/SQL] Function that removes all unfriendly signs from the title example: "Hello! World" to "hello-world"
function Slug($string)
{
return strtolower(trim(preg_replace('~[^0-9a-z]+~i', '-', html_entity_decode(preg_replace('~&([a-z]{1,2})(?:acute|cedil|circ|grave|lig|orn|ring|slash|th|tilde|uml);~i', '$1', htmlentities($string, ENT_QUOTES, 'UTF-8')), ENT_QUOTES, 'UTF-8')), '-'));
}

// [xPDO] Issue queries against the foreign database, for testing limited to a few ids instead of "WHERE id is null"
$output = '';
$sql = "SELECT * FROM myuri WHERE id BETWEEN 564780000 AND 564781000";
foreach ($xpdo->query($sql) as $row) {
$output .= $row['title'];
}

// [PHP/SQL] take the xPDO query results and run "function Slug($string)" on it (i guess this needs to go into the "foreach" somehow)
$user = $output;
$item = "test-parent-folder/".Slug($user).".html";

// [PHP/SQL] Update the column "uri", for testing limited to a few ids instead of "WHERE id is null" (this needs to go into the "foreach" too)
mysql_query("UPDATE myuri SET uri = '$item' id BETWEEN 564780000 AND 564781000");

所以基本上我需要做两件主要的事情。

1.) 将所有 [xPDO] 组件替换为 [PHP/SQL] 组件,以便能够将其作为 cron 作业运行

2.) 将内容包含到每个函数中,这是我的 php 技能达到其极限

3.)(可选)根据我在一些帖子中所读到的内容,使用“内爆”运行它可能会很聪明,因为该表有 1.000.000 行,所以它运行得更快

如果有人可以帮助我,那就太好了。

4

1 回答 1

0

只是一个简短的说明,

mysql_query("UPDATE myuri SET uri = '$item' id BETWEEN 564780000 AND 564781000");

我猜不会做你想做的事,这个函数会用一个新值覆盖 5647800000 和 564781000 之间的所有值。在下面的代码中,我已经解决了这个问题,就像你想要的那样(可能这就是 URL 缩短器的工作方式)

<?php
define('MODX_CORE_PATH', '/website/domain.tld/core/');
define('MODX_CONFIG_KEY','config');
require_once MODX_CORE_PATH . 'model/modx/modx.class.php';
//FILL THIS IN//
$host = 'hostname';
$username = 'user';
$password = 'password';
$dbname = 'database';
$port = 3306;
$charset = 'utf-8';

//DON'T CHANGE BELOW//
mysql_connect($host,$username,$password);
mysql_select_db($dbname);

// [PHP/SQL] Function that removes all unfriendly signs from the title example: "Hello! World" to "hello-world"
function Slug($string)
{
return strtolower(trim(preg_replace('~[^0-9a-z]+~i', '-', html_entity_decode(preg_replace('~&([a-z]{1,2})(?:acute|cedil|circ|grave|lig|orn|ring|slash|th|tilde|uml);~i', '$1', htmlentities($string, ENT_QUOTES, 'UTF-8')), ENT_QUOTES, 'UTF-8')), '-'));
}

$items = mysql_query("SELECT * FROM myuri WHERE id BETWEEN 564780000 AND 564781000");
while($item = mysql_fetch_object($items)) {
mysql_query("UPDATE myuri SET uri='test-parent-folder/".Slug($item->title).".html' WHERE id='".$item->id."'");
}
于 2013-07-02T14:20:31.140 回答