עבור לתוכן

בעיית שילוב פונקציה עם Html בAsp

Featured Replies

פורסם

שלום,יש לי בעיה, אני מאמין שהיא דיי בסיסית..

יצרתי טבלה דינמית אשר תכיל שם מוצר לצידו כפתור Submit שבתוכו הכנסתי פונקציה(onclick) שלוקחת את הId של אותו מוצר ומכניסה אותו לטבלה עפ"י אותו יוזר.

הבעיה היא שא )לחיצה על הכפתור לא עובדת

ב)הוא פשוט מצרף לי את כל המוצרים ישר כשהעמוד עולה מבלי קשר אם הפונקציה נקראה או לא.

מישהו יכול להסביר לי בעדינות למה :)?

תודה מראש!

קוד:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"

"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">

<table border="2" bgcolor="#66FF99" frame="border" align="center" style="bottom: 60%;right: 50%; position: absolute">

<%

dim user,product

product=""

user=Session("Member")

Dim conn, SQLstr,rs

Set conn = Server.CreateObject("ADODB.Connection")

Set rs = Server.CreateObject("ADODB.Recordset")

conn.Open "practice"

function add_product(product)

SQLstr = "INSERT INTO Quantity (Product_id,Username,Quantity) VALUES ('" & product & "','" & user & "',1)"

conn.Execute SQLstr

end function

SQLstr="select * from products"

rs.Open SQLstr,conn

Do While not rs.EOF

%>

<tr>

<td>

<%=rs("Product_name")%>

</td>

<td>

<input type="submit" name="<%=rs("Product_name")%>" value="Add Product" onclick="<%=add_product(rs("Product_id"))%>" />

</td>

</tr>

<%

rs.MoveNext

Loop

%>

</table>

<html xmlns="http://www.w3.org/1999/xhtml">

<head>

<title></title>

</head>

<body>

</body>

</html>

פורסם

אתה לא יכול לעשות מה שרצית לעשות שם. אתה מערבב בין צד שרת לצד לקוח.

ב- onclick אתה אמור לשלוח את המשתמש לדף אחר שיבצע את ההוספה.

קודם רץ הקוד בצד השרת(ולכן הוא תמיד מוסיף אותם), אחר כך בצד הלקוח.

אם תשים לב, לא יהייה רשום לך כלום ב- onclick אחרי שאתה מקבל את הדף.

פורסם

כמו שאמר קודמי onclick הינו אירוע בצד הלקוח שמצפה לפונקציה בתסריט לקוח הכתוב לדוגמא ב JAVASCRIPT או VBSCRIPT .

עכשיו מה שאתה יכול לעשות כאן זה שבלחיצה על כל כפתור כזה תבצע הפניה לעמוד/תסריט ASP אחר שיבצע את הפעולה המבוקשת בהתאם לפרמטרים שאתה מעביר לו, זה די פשוט פשוט בכל תא שאתה יוצר בטבלה שלך תיצור משהוא בסיגנון:


<input type="hidden" id="userid" value="your value">
<input type="submit" value="add">
</form>
<form action="add.asp" method="post">

אופציה אחרת היא להשתמש במה שנכלל כיום תחת AJAX וזה אומר לשלוח את הנתונים באמצעות JAVASCRIPT לתסריט שרת ברקע באופן שהמשתמש לא מבחין בפועל בתהליך שליחת הנתונים - כלומר הדף המוצג לו לא נטען מחדש בכל לחיצה על פתור.

זה קצת יותר מסובך הינה דוגמא קטנה:


if(window.XMLHttpRequest){
http = new XMLHttpRequest( );
} else if (window.ActiveXObject){
http = new ActiveXObject("Msxml2.XMLHTTP");
if (! http){
http = new ActiveXObject("Microsoft.XMLHTTP");
}
}

function add(user_id,data) {
var myurl = "add.asp";
var tosend = "userid=" + escape(user_id) + "&data=" + escape(data);
http.open("POST", myurl, true);
http.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
http.onreadystatechange = useHttpResponse;
http.send(tosend);
}

function useHttpResponse() {
if (http.readyState == 4) {
var textout = http.responseText;
//alert(textout);
//document.writeln(textout);
}
}

</script>
<script language="JavaScript">

ואז אתה פשוט יכול בתאי הטבלה שאתה יוצר ליצור כפתור פשוט שיבצע קריאה לפונקציה בלחיצה עליו ויעביר את הפרמטרים הרלוונטים

<input type="button" id="addBtn" vaalue="Add" onclick="javascript:add('userid','blablabla');">

שים לב שבכדי לקרוא את הפרמטרים האלו ב קובץ add.asp שאני פונה עליו בדוגמא שנתתי לך אתה פשוט קורא אותם באמצעות request.querstring ובסוגרים שם המשתנה או request.form ובסוגריים שם המשתנה - זה תלוי איך אתה בוחר להעביר את הנתונים בשיטת ה GET או בשיטת ה POST

בדוגמא שלי בחרתי להעביר את הפרמטרים ב POST על כן אשתמש ב REQUEST.FORM לדוגמא:


<%
dim userid = request.form("userid")
dim data = request.form("data")
'now you have those variables and you can do what ever you want to do for ex. call to a sub routine to add them in to the DB
%>
<!-- add.asp -->

זהו בגדול אני מקווה שעזרתי לך בפיתרון הבעיה.

פורסם
  • מחבר

אוקי,בחרתי בשיטה הראשונה (והפשוטה יותר ) אני דיי מתחיל בכל הנושא הזה כרגע ,ובכל זאת עדיין אני מתקשה, אני מקבל יותר מדיי ארורים בנושא.

איך אני מנסח את הForm בצורה נורמלית כדיי שיוכל לעזור לי.

אני אצרף את הקוד שוב עם כל השינויים (שאין יותר מדיי :) ) שעשיתי.


<table border="2" bgcolor="#66FF99" frame="border" align="center" style="bottom: 60%;right: 50%; position: absolute">
<%
dim user,product
product=0
user=Session("Member")
Dim conn, SQLstr,rs
Set conn = Server.CreateObject("ADODB.Connection")
Set rs = Server.CreateObject("ADODB.Recordset")
conn.Open "practice"
if product <> 0 then
product=request.form("product")
SQLstr = "INSERT INTO Quantity (Product_id,Username,Quantity) VALUES (" & product & ",'" & user & "',1)"
conn.Execute SQLstr
end if

SQLstr="select * from products"
rs.Open SQLstr,conn
Do While not rs.EOF
%>
<tr>
<td>
<%=rs("Product_name") %>
<% product=rs("Product_id") %>
</td>
<td>
<form action="add.asp" method="post">
<input type="hidden" name="<%product%>" value="<%=rs("Product_name")%>">
<input type="submit" value="add">
</form>

</td>
</tr>


<%
rs.MoveNext
Loop

פורסם

אם אני מנתח נכון את הקוד שכתבת אז שים לב!

המשתנה product שלך אף פעם לא מתקדם ותמיד שומר על ערכו ההתחלתי שהוא 0

דבר שני - כשאתה מגדיר את השדה המוסתר שמכיל את הפרמטר להעברה והכנסה אז תדאג שיהיה לו שם קבוע ולא שם שמשתנה נומר בכל איטרציה כי אחרת אתה לא תוכל לדעת בכל פעם איזה משתנה לצפות לקבל ב Request.Form.

הינה לך הקוד המתוקן לדעתי זה אמור לעבוד לך וזאת בהנחה גם שאנחנו מדברים על דף אחד ב ASP שיעשה בעצם הכל גם הצגת רשומות מבסיס הנתונים וגם הכנסת פריט נבחר מתוך רשומות אלו לבסיס הנתונים לפי בחירת המשתמש.


<%
dim user,product
product=request.form("product")
user=Session("Member")
Dim conn, SQLstr,rs
Set conn = Server.CreateObject("ADODB.Connection")
Set rs = Server.CreateObject("ADODB.Recordset")
conn.Open "practice"
if product <> "" then
SQLstr = "INSERT INTO Quantity (Product_id,Username,Quantity) VALUES (" & product & ",'" & user & "',1)"
conn.Execute SQLstr
end if

SQLstr="select * from products"
rs.Open SQLstr,conn
Do While not rs.EOF
%>
<tr>
<td>
<%=rs("Product_name") %>
<% product=rs("Product_id") %>
</td>
<td>
<form action="add.asp" method="post">
<input type="hidden" name="product" value="<%=rs("Product_name")%>">
<input type="submit" value="add">
</form>

</td>
</tr>


<%
rs.MoveNext
Loop
<table border="2" bgcolor="#66FF99"  frame="border" align="center"  style="bottom: 60%;right: 50%; position: absolute">

כמו כן ראיתי שאתה מכניס בשאילתה שלך את שם המוצר ואת שם המשתמש / קוד הזיהוי שלו, בדרך בשאילתות וטבלאות כאלו אתה תכניס את שם המשתמש/הקוד המזהה שלו ואת הקוד המזהה (id) של המוצר ולא את שמו של המוצר.

ההיגיון לרוב אומר שהשמות בעיקרון יכולים ליהיות חופפים בין מוצר למוצר אחרי הכל מדובר בטיפוס נתונים מסוג מחרוזת ואילו לעומת זאת מספר מזהה של מוצר יהיה יחידני לכל מוצר כלומר חד ערכי והוא ייוצג בבסיס הנתונים לדוגמה בשדה נתונים מסוג מיספור אוטומאטי (autonumber)

פורסם
  • מחבר

האמת היא שכנראה באמת לא הבנת אותי

אני מכניס בטבלה את קוד המוצר (product_id) נתתי לו שם משתנה בתור product סתם ככה כי זה עמוד לימודי בשביל עצמי...

התכוונתי מאוחר יותר לעדכן הכל ולהכניס תיעוד והכל.

בנוסף אני מכניס את היוזר מהסשן וכמות (שמסומנת בתור 1, שעדיין לא טיפלתי בזה)

עכשיו בעיקרון לפי הפונקציה שלך אני מקבל את הProduct מה Hidden שהוא דיי קבוע לא ?

אז איך תמיד השם ישתנה? הריי בhtml הצבת את זה בתור שם רגיל ולא בתור משתנה, אז איך הערך שלו יהיה דינאמי?

אולי אני טועה?

אני לא בבית עכשיו, אבל אבדוק את זה מאוחר יותר יכול שאני טועה (אולי אפילו סביר..)

פורסם

אכן, הערך יהייה קבוע, ולא ישתנה. אך שים לב שזה יהייה קבוע לכל מוצר. לכל מספר יש את המזהה שלו(ששמת בHIDDEN) ולא ניתן לשנות את המזהה של כל מוצר.

אני מציע לך להריץ את הדף ולראות את קוד הHTML שהוא יוצר לך. זה יעזור לך להבין מה הולך שם.

פורסם
  • מחבר

אכן, הערך יהייה קבוע, ולא ישתנה. אך שים לב שזה יהייה קבוע לכל מוצר. לכל מספר יש את המזהה שלו(ששמת בHIDDEN) ולא ניתן לשנות את המזהה של כל מוצר.

אני מציע לך להריץ את הדף ולראות את קוד הHTML שהוא יוצר לך. זה יעזור לך להבין מה הולך שם.

אכן כן,בדקתי ובאמת הכל הסתדר לי... למרות שבאמת רציתי להוסיף את הערך של הProduct_id אבל זה רק היה עניין של שינוי ה Value

המון תודה לך

ולמשורר!

צפו לעוד התקלות :)

ארכיון

דיון זה הועבר לארכיון ולא ניתן להוסיף בו תגובות חדשות.

דיונים חדשים