問題: 試了很多天,沒辦法透過PHP 完成插入DATA的工作,瀏覽器執行的時候確實有清除使用者輸入的表單,猜想應該是POST 行為成功?,但回訪資料庫端確實沒資料,新手想不到問題在那,求解?
己經處理的動作
ADMIN 權限全開/允許遠端登入/ACCOUNT 資料表允許ADMIN 操作
驗證資料是不是有進入資料庫方式
use member;
select * fROM account where 'name' like '%';
-----code------
<?php
//connect to database
$db = mysqli_connect("localhost","admin","*","member");
if(isset($_post['register_btn'])){
$name = mysql_real_escape_string($_post['name']);
$email = mysql_real_escape_string($_post['email']);
$password = mysql_real_escape_string($_post['password']);
mysql_query("INSERT INTO account(name, email, password) VALUES('$name', '$email', '$password')");
echo 'insert 1 record';
}
?>
<!Doctype html>
<html>
<Title>會員註冊</Title>
<body>
<div class="header">
<h1>會員註冊</h1>
<form method="post" action="register.php">
<table>
<tr>
<td>使用者名稱:</td>
<td><input type="text" name="name" class="textInput"></td>
</tr>
<tr>
<td>E-Mail:</td>
<td><input type="text" name="email" class="textInput"></td>
</tr>
<tr>
<td>密碼:</td>
<td><input type="text" name="password"" class="textInput"></td>
</tr>
<tr>
<td></td>
<td><input type="submit" name="register_btn" value="Register"></td>
</tr>
</table>
</form>
</div>
</body>
</html>
為什麼 connect 就用 mysqli_connect
query 卻不用 mysqli_query 而用 mysql_query ?
拿以下這個範例去改著用吧
<?php
$servername = "localhost";
$username = "username";
$password = "password";
$dbname = "myDB";
// Create connection
$conn = mysqli_connect($servername, $username, $password, $dbname);
// Check connection
if (!$conn) {
die("Connection failed: " . mysqli_connect_error());
}
$sql = "INSERT INTO MyGuests (firstname, lastname, email)
VALUES ('John', 'Doe', 'john@example.com')";
if (mysqli_query($conn, $sql)) {
echo "New record created successfully";
} else {
echo "Error: " . $sql . "<br>" . mysqli_error($conn);
}
mysqli_close($conn);
?>
MySQL 保留字
https://dev.mysql.com/doc/refman/8.0/en/keywords.html
table , column 的名稱最好避掉保留字.若堅持一定要使用,就要使用 ` `包起來,
不過這樣是會比較麻煩.
另外最好是能夠把執行 query 後,MySQL 回覆的狀況做判斷.
換一本新一點的書吧, MySQLi 已經是很久以前的東西了.幾乎來這裡問PHP的新手,
都會被提醒要換PDO.
不過以我的觀察,很多新手幾乎還沒撐到換PDO , 就陣亡消失了.
祝你好運,加油!
上面兩位大神已經教你了。
我就不再多說什麼了。
我先不論你要不要換pdo啥的。
你的sql本身就有問題了。
INSERT INTO account(name, email, password) VALUES
光這一段就能看出一個問題。你的表名跟欄位宣告之間並沒隔開一個空格。
會造成將其當一個函數使用。
理論上來說,你因該會得到一個錯誤。
先學學一下海綿寶寶給你的程式碼。
然後再去找pdo相關的東西。改掉使用mysqli的使用方式。
謝謝大神指教
光這一段就能看出一個問題。你的表名跟欄位宣告之間並沒隔開一個空格。
會造成將其當一個函數使用。
應該是不會影響唷
如果沒問題?請問會不會是那個設定我還需要確認的?例如php.ini?
dragonH
不要隨便教偏門的,這種東西他未來會懂。
且你說的也並非是完全正確。
當用到函數名的話就會發生錯誤。
本來就不該這樣寫的。只是mysql嚴格度不強。
有時情況可以過。
不要隨便教新手這樣沒問題。要告訴他正規的做法。
情況1
以 mysql 保留字 來命名 table
會無法建立
所以也就不會有 因為沒空格
就把 table name 當作函數的問題
因為 table 就已經建不起來了
情況2
有同名stored function的情況下
table name 前有空格
table name 前沒有空格
結果
兩者都成功
應該只有這兩種情況吧
我非常同意要加空格的作法
因為我平常也是這樣寫
但是我認為需要建立在實際的情況上
不然現在網路那麼發達
很容易造成不那麼正確的訊息一直傳播下去
(不然我也很想說寫 js 不加 ; 會 error 跟一定要用 eslint XD
建立一個sum的表,內有id p1 p2 p3都是int
然後再去試試如下兩個語法試試
INSERT INTO sum(id,p1,p2,p3) VALUES (null,1,2,3);
INSERT INTO sum (id,p1,p2,p3) VALUES (null,1,2,3);
INSERT INTO `sum`(id,p1,p2,p3) VALUES (null,1,2,3);
其實第一個就會掛了。其它兩個都可以正常運行。
或許你會說這是保留字的問題。
但你無法去說為何第二個不會有事。
當然,我的說法不明確也是事實。但這是我故意的。
如果你有注意到。我是說「你"因該"會得到一個錯誤」
其就是代表了,也有可能不會有錯誤。
借此來引導新手來追問更多的問題跟知道他的實作情況。
如果今天是由他來說出來沒錯誤訊息。
這就是代表他有心了解及追求問題的真相。
且我對他說的也並不是不實在的錯誤訊息。
我也用上面的例子來証明我說的沒有錯。
記得一件事
「錯誤的用法可以使用,並不是代表它是對的。只是情況允許沒事而已」
千萬不要有「沒事就這樣用吧」。你會有除不完的bug。
既然我們的說法都有漏洞
那就這樣吧
反正他看完我們的討論應該也差不多懂了XD
今天有再啃一次資料,確實SQL 對語法表示沒有其他程式語言要求的嚴格,往後這點會再注意的,謝謝二位大大