我正在制作一个复制网站(复制codingbat.com),而且我一直在设计它,我不得不停下来,我需要决定使用Java后端或PHP后端。我已经完成了一个Java,但它似乎并不像是非常高效和安全:
<?php
include ("/var/www/challenges/challenges/java/java.class.php");
function getChallenge()
{
return new JavaIntroIIIChallenge();
}
class JavaIntroIIIChallenge extends JavaChallenge
{
public $abbas = array();
public function __construct()
{
$this->abbas = $this->getABBAs();
parent::__construct1(3, "public static void printABBA(String a, String b) {\n\n}\n",
$this->getStringLiteral($this->abbas));
}
public function getStringLiteral($abbas) {
$return = "";
foreach ($abbas as $ab){
$return .= $ab[0] . ":" . $ab[1]. " ";
}
echo $return;
return $return;
}
public function getABBAs()
{
$array = array();
$array1 = array("x" , "y", "Hello" , "a" , "b", "c" , "5", "t");
$array2 = array("y" , "x", "CodeMeh" , "b" , "c", "a" , "0", "z");
$rand = array_rand($array1, 5);
return array(array($array1[$rand[0]], $array2[$rand[0]]), array($array1[$rand[1]], $array2[$rand[1]]), array($array1[$rand[2]], $array2[$rand[2]]),array($array1[$rand[3]], $array2[$rand[3]]),
array($array1[$rand[4]], $array2[$rand[4]]));
}
public function getFullCode($cName, $subCode)
{
return "public class $cName {\npublic static void main(String[] args) {System.out.println(\"HELLO\");for(String arg:args){System.out.println(\"HELLO\");String[] ab = arg.split(\":\");printABBA(ab[0], ab[1]);}} $subCode }";
}
public function getResults($output)
{
$results = array("success" => false);
if (empty($output))
{
$results['success'] = false;
} else
{
$count = 0;
$index = 0;
foreach ($output['output'] as $line)
{
$string = $this->abbas_literal[$index][0] . $this->abbas_literal[$index][1] . $this->abbas_literal[$index][1] . $this->abbas_literal[$index][0];
//echo $string . "123";
if (strtolower($string) == strtolower($line)){
$results['tr'][$index]['expected'] = $string;
$results['tr'][$index]['thisrun'] = $line;
$results['tr'][$index]['ok'] = "✓";
$results['tr'][$index]['color'] = "green";
$count++;
} else {
$results['tr'][$index]['expected'] = $string;
$results['tr'][$index]['thisrun'] = $line;
$results['tr'][$index]['ok'] = "X";
$results['tr'][$index]['color'] = "red";
}
if($index == 4) {
break;
}
$index++;
}
if($count == 5){
$results['success'] = true;
}
}
return $results;
}
public function printSolution()
{
return "<p><div align=left><code>public static void printHelloWorld() {<br><p>System.out.println(\"Hello world!\");</p><br>}<br></code></div></p>";
}
public function getDescription()
{
return $this->desc;
}
}
?>
<?php
include ("/var/www/challenges/challenges/base.class.php");
abstract class JavaChallenge extends BaseChallenge
{
private $code = "";
private $args = array();
public function __construct($id, $code)
{
parent::__construct($id);
$this->code = $code;
}
public function __construct1($id, $code, $args)
{
parent::__construct($id);
$this->code = $code;
$this->args = $args;
}
/**
* Prints the body of the challenge
*/
public function printBody()
{
$cName = "c" . $this->id . "_" . rand(0, getrandmax());
if (!$this->isFinished())
{
//<div class="windowbg"> <span class="topslice"><span></span></span>
if (isset($_POST['purchase']))
{
if (purchase("Solution for " . $this->name, "You purchased the solution to " . $this->
name, $this->points * 2))
{
$this->message("You purchased the Solution!", $this->printSolution());
} else
{
$this->message("Insufficient funds!", "Unable to purchase this item!");
}
}
?>
<div class="sp_block">
<div>
<center>
<?php
if (isset($_POST['code']))
{
$code = $_POST['code'];
$output = $this->getOutput($cName, $code);
if (!$output['error'])
{
$results = $this->getResults($output);
?>
<table width="50%" border="2">
<tbody>
<tr>
<th>Expected</th>
<th>This Run</th>
<th></th>
<th></th>
</tr>
<?php
foreach ($results['tr'] as $row)
{
echo "<tr><td> " . $row['expected'] . "</td><td><pre>" . $row['thisrun'] .
"</pre></td><td>" . $row['ok'] . "</td><td bgcolor=" . $row['color'] .
"> </td></tr>";
}
?>
</tbody>
</table>
<?php
if ($results['success'])
{
?>
<img width="30" height="30" src="http://www.codemeh.com/forums/Themes/default/images/tick.png"><font size="+2">+<?php
echo $this->points;
?> Points</font>
</center>
<?php
$this->award();
}
} else
{
$this->message("Error!", $output['problem']);
}
}
?><br /><br />
</div>
<center>
<span style="font-size:16px">
<?php
echo htmlspecialchars($this->getDescription());
?></pre>
</span><br>
<br>
<div style="width: 85%;" align="right"><form method="post"><input name="purchase" value="Purchase The Solution (<?php
echo $this->points * 2;
?> Points)" type="submit" /></form></div><br />
<form method="post">
<script language="javascript" type="text/javascript" src="***"></script>
<script language="javascript" type="text/javascript">
editAreaLoader.init({
id : "code" // textarea id
,syntax: "java" // syntax to be uses for highgliting
,start_highlight: true // to display with highlight mode on start-up
});
</script>
<textarea id="code" name="code" rows="30" cols="100"><?php
echo isset($_POST['code']) ? $_POST['code'] : $this->code;
?></textarea>
<br>
<input type="submit" />
</form>
</center>
</div>
<?php
//<span class="botslice"><span></span></span> </div>
} else
{
$this->message("Error!", "You have already finished " . $this->name . ".");
}
}
/**
* Gets the final output of the code.
*/
public function getOutput($name, $code)
{
global $SSH;
$ssh = ssh2_connect('127.0.0.1', 22);
ssh2_auth_password($ssh, 'root', '***');
echo $ssh;
$output = array('error' => false, 'problem' => "", 'output' => array());
$full = $this->getFullCode($name, $code);
$write = file_put_contents(JAVA_SOURCE_FOLDER . $name . ".java", stripslashes($full));
if ($write)
{
//$javac = ssh2_exec($ssh, "javac -d " . JAVA_COMPILED_FOLDER . " " .
// JAVA_SOURCE_FOLDER . $name . ".java");
// exec a command and return a stream
$javac = getData(ssh2_exec($ssh, "javac -d " . JAVA_COMPILED_FOLDER . " " .
JAVA_SOURCE_FOLDER . $name . ".java"));
if (strlen($javac) == 0)
{
$cd = "cd " . JAVA_COMPILED_FOLDER;
$chmod = "chmod 755 " . $name . ".class";
$java = "java -Xmx50M -Djava.security.manager -Djava.security.policy==" .
JAVA_HOME_FOLDER . "my.policy " . $name . " ";
if (!empty($this->args))
{
foreach ($this->args as $arg)
{
$java .= $arg . " ";
}
}
$data = getData(ssh2_exec($ssh, "$cd\n$chmod\n$java"));
if (strlen($data) > 0)
{
$output['output'] = explode("\n", $data);
} else
{
$output['error'] = true;
$output['problem'] = "Nothing was printed.";
}
} else
{
$output['error'] = true;
$output['problem'] = "Compilation error: $javac.";
}
} else
{
$output['error'] = true;
$output['problem'] = "File contents = $write, So the file was not able to be written.";
}
return $output;
}
public abstract function getDescription();
/**
* Gets the results of the output.
*/
public abstract function getResults($output);
/**
* Gets the finished compilable code.
*/
public abstract function getFullCode($cName, $subCode);
}
?>
这是当前的PHP版本......对我来说看起来非常草率,这是我能做到的最好的...所以我想知道你的意见,我应该使用Java后端并制作Java应用程序打印出一些HTML?或者我应该继续使用PHP后端吗?
对不起,我无法解释得更好,我自己几乎无法解释......
答案 0 :(得分:1)
考虑使用MVC模式。它看起来更好,更易于维护,并具有许多其他优点。
答案 1 :(得分:1)
是的,你的代码相当草率。您将HTML,业务逻辑,甚至一些应该在库或辅助函数中的代码混合在一起,但这是您在不使用PHP框架时获得的代码。我发现一个合适的MVC框架使我的PHP代码与您在Python或Java中可以找到的任何内容一样可读。请查看CodeIgniter或Kohana。